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>