Подтвердить что ты не робот

Xpath/XSLT: проверьте, является ли следующий родной брат конкретным node

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

Это тип 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>

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

4b9b3361

Ответ 1

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

  • если вы ищете первый элемент, следующий из /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>

Ответ 2

Мне нужно написать условие 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.

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