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).
Любая помощь в правильном направлении будет высоко оценена.
Ответы
Ответ 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()
.