Xpath / XSLT: проверьте, является ли следующий узел одним и тем же узлом - PullRequest
15 голосов
/ 29 сентября 2011

Я видел вопросы, в которых было применено последующее сопоставление на основе значения узла, но моя проблема связана с самим фактическим узлом.

Это тип XML, который у меня есть:

<Employee>
    <Summary>
        <A>
        <B>
    </Summary>
    <Elections>
    </Elections>
<Employee>

Мне нужно написать условие Xpath следующим образом:

if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something.

В настоящее время у меня есть:

<xsl:if test="(not(following-sibling::Employee/Summary[1]='Earnings'))
    <xsl:call-template name="EmployeeRecord"/>
</xsl:if>

Обратите внимание, что я проверяю не значение узла, а узелсам (то есть имя узла).Любая помощь в правильном направлении будет высоко ценится.

Ответы [ 2 ]

32 голосов
/ 29 сентября 2011

Вы на правильном пути. Ось following-sibling вычисляется из узла контекста на предыдущем шаге.

  • если вы ищете первый элемент, следующий за братом или сестрой /Employee/Summary, вы должны использовать: /Employee/Summary/following-sibling::*[1].

  • Чтобы оценить, является ли этот первый следующий брат или сестра элементом Elections, вы можете использовать дополнительный фильтр предикатов [self::Elections].

  • Проверяя отрицание этого, оберните все это в not()

Собираем все вместе, подстраиваем ваш пример:

<xsl:if test="not(/Employee/Summary/following-sibling::*[1][self::Elections])">
    <xsl:call-template name="EmployeeRecord"/>
</xsl:if>
3 голосов
/ 29 сентября 2011

Мне нужно написать условие Xpath следующим образом:

if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something.

Использовать :

not(/Employee/Summary/following-sibling::*[1][self::Elections])

Выражение XPath, котороеВ качестве аргумента функции not() выбирается любой элемент Elections, который является первым последующим элементом любого другого элемента Summary, который является дочерним элементом верхнего элемента Employee.

Если при этом не будет выбран ни один узел, приведенное выше выражение XPath оценивается как true().

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