Как использовать параметр в качестве индекса в XSLT - PullRequest
1 голос
/ 15 сентября 2010

У меня есть рекурсивный шаблон, чтобы я мог обновлять счет.В этом шаблоне я хочу использовать текущий счетчик, чтобы получить доступ к узлу, индекс которого является текущим счетчиком.

<!-- in the template -->

<xsl:param name="i"/>
<xsl:param name="count"/>      

<NewNode>
    <xsl:value-of select="//ACommonElementInTheDocument[$i]/MyElement"/> : <xsl:value-of select="$i"/>
</NewNode>

Я получаю $ i, распечатанный правильно, как и ожидалось, но яЯ не могу ссылаться на элемент, хотя это прекрасно работает, когда я использую XMLSpy для проверки XPath.

Может ли кто-нибудь указать на явную ошибку, которую я совершаю, пожалуйста? ...

Большое спасибо

Ответы [ 2 ]

4 голосов
/ 15 сентября 2010

В XSLT 1.0 / XPath 1.0 переменные / параметры не вводятся явно .

Следовательно, в XSLT 1.0 решение должно использовать:

someExpression[position() = $i]

или

someExpression[number($i)]

В XSLT 2.0 лучше всего определить параметр как xs:integer:

<xsl:param name="i" as="xs:integer"/>

затем используя

someExpression[$i]

дает желаемый результат.

Обратите внимание, однако, , что такое выражение, как:

//ACommonElementInTheDocument[1]

не выбирает первый элемент в документе с именем ACommonElementInTheDocument.

Это выражение выбирает каждый ACommonElementInTheDocument элемент, который является первым ACommonElementInTheDocument дочерним элементом его родителя - поэтому приведенное выше выражение обычно может возвращать много элементов, и возможно, что ни один из них не будет первый ACommonElementInTheDocument в документе.

Вот почему решение @ Per-T, скорее всего, неверно - как в XSLT 1.0, так и в XSLT 2.0 .

Вместо :

//ACommonElementInTheDocument[number($i)]/MyElement 

использование

(//ACommonElementInTheDocument)[number($i)]/MyElement 

Помните : оператор [] связывает сильнее (имеет более высокий приоритет), чем сокращение //.

1 голос
/ 15 сентября 2010

Я не уверен, как вы объявили параметр. Но я думаю, что это проблема приведения типов. Что произойдет, если вы попытаетесь:

//ACommonElementInTheDocument[number($i)]/MyElement

Или в XSLT 2.0 вы также можете использовать один из типов схем XML:

//ACommonElementInTheDocument[xs:integer($i)]/MyElement
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...