XPath Выберите узел из текущего значения узла, когда два имени атрибута совпадают - PullRequest
4 голосов
/ 23 февраля 2010

Может ли кто-нибудь помочь мне с этой маленькой проблемой, с которой я столкнулся.

XML

<MPN>
    <MTR MSN="AB123456"/>
    <MTR MSN="AB654321"/>
    <MTR MSN="AB654322"/>
    <MTR MSN="AB654323”/>
    <MTR MSN="AB654324"/>
    <JOB JobId="136">
        <JMR MSN="AB123456">
            <JRA DateActionRequiredBy="20090701120012" />
        </JMR>
        <JMR MSN="AB654321">
            <JRA DateActionRequiredBy="20090701100010" />
        </JMR>
    </JOB>
</MPN>

Я хотел бы получить DateActionRequiredBy из элемента JRA, когда синтаксический анализатор находится в элементе MTR, должен возвращаться только один.

Я пытался.

../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy

, который возвращает {Dimension: [2]} NodeSet , это соответствует всему из-за того, что атрибут @MSN эффективно соответствует самому себе, а не родительскому.

../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy

, который возвращает {Dimension: [2]} NodeSet

Я нашел решение, но для него потребуется переменная внутри каждого атрибута xsl:, что мне не подходит.

<xsl:variable name="storeMSN" select="@MSN"/>
../JOB/JMR[@MSN = $storeMSN]/JRA/@DateActionRequiredBy

который возвращается 20090701120012 Атрибут

Это то, чего я добиваюсь, но должен быть более простой способ добиться этого, кроме переменной для каждого атрибута.

Заранее спасибо.

1 Ответ

8 голосов
/ 23 февраля 2010
<MPN>
    <MTR MSN="AB123456"/>
    <MTR MSN="AB654321"/><!-- current node (i.e. context node) -->
    <MTR MSN="AB654322"/>
    <MTR MSN="AB654323”/>
    <MTR MSN="AB654324"/>
    <JOB JobId="136">
        <JMR MSN="AB123456">
            <JRA DateActionRequiredBy="20090701120012" />
        </JMR>
        <JMR MSN="AB654321">
            <JRA DateActionRequiredBy="20090701100010" /><!-- desired node -->
        </JMR>
    </JOB>
</MPN>

тогда вам нужно использовать этот XPath:

../JOB/JMR[@MSN = current()/@MSN]/JRA/@DateActionRequiredBy

Обратите внимание, что это будет работать только в XSLT, поскольку current() является функцией XSLT.

Вы можете упростить процесс, добавив ключ XSL:

<xsl:key name="kJMR" match="JMR" use="@MSN" />

и в XPath:

key('kJMR', @MSN)/JRA/@DateActionRequiredBy

Объяснение, почему ваши попытки не работают, как ожидалось. Оба

  • ../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy
  • ../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy

сравните @MSN с самим собой - операция, которая никогда не может завершиться неудачей. Таким образом, вы всегда получаете все возможные узлы.

Внутри предиката контекст XPath всегда является узлом, к которому вы применяете предикат. Функция current() предназначена для предоставления вам контекста XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...