Вопрос

Я не уверен, действительно ли я совершаю ошибку или это просто не работает должным образом:

<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>        
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top