XPath / XmlCompiledTransform: проверка родителя с помощью функции XPath

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

<xsl:if test="position() = 1 or parent::position() = 1">
   <!-- do something -->
</xsl:if>

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

Проблема в "parent::position() = 1" .. с XmlCompiledTransform.net я получаю

Ожидаемый конец выражения, найдено '('. ...sition() = 1 или parent:: position ->(<- = 1.

Теперь, очевидно, ей не нравится эта функция position () во второй части, но... как мне получить позицию родителя? Как вообще объединить функции XPath с XPaths в тестах?

1 ответ

Решение

Хороший вопрос, +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>        
Другие вопросы по тегам