Xpath / xmlcompiledtransform: тест родителя с функцией xpath
-
26-10-2019 - |
Вопрос
Я не уверен, действительно ли я совершаю ошибку или это просто не работает должным образом:
<xsl:if test="position() = 1 or parent::position() = 1">
<!-- do something -->
</xsl:if>
Если текущий узел является первым ребенком, или его родитель - первый ребенок, то сделайте что -нибудь особенное.
Проблема заключается в том, что «parent :: position () = 1» .. с .net's xmlcompiledtransform я получаю
Ожидаемый конец выражения, найденный '('. ... sition () = 1 или родитель :: позиция-> (<-= 1.
Теперь, по -видимому, ему не нравится эта функция позиции () во второй части, но .. как мне получить позицию родителя? Как мне, как правило, комбинировать Функции XPath с XPaths в тестах?
Решение
Хороший вопрос, +1.
Вам нужно определить, что подразумевается под должность родителя.
parent::node()[position() = 1]
является всегда true()
Когда существует родительский узел ( false()
Только если узел контекста является узлом документа /
Поскольку этот узел является верхним узлом в дереве и не имеет родителя), потому что любой узел в дереве (хорошо сформированный документ XML) по определению может иметь не более одного родительского узла.
Скорее всего, вы хотите проверить, что родительский элемент является первым в порядке документа среди своих братьев и сестер. Анкет Один из способов проверить это:
not(parent::node()/preceding-sibling::*)
Итак, полный код становится:
<xsl:if test="position() = 1 or not(parent::node()/preceding-sibling::*)">
<!-- do something -->
</xsl:if>