xpath найти значение текущего узла - PullRequest
4 голосов
/ 13 апреля 2011

У меня есть несколько узлов с тем же именем = 'UPC', и мне нужно найти значение текущего.

<XML>
<Attribute>
      <Name>UPC</Name>
      <Type>ComplexAttr</Type>
      <Value>Testing</Value>
    </Attribute>
    <Attribute>
      <Name>UPC</Name>
      <Type>ComplexAttr</Type>
      <Value>24a</Value>
    </Attribute>
</XML>

Ожидаемый результат: Следует извлечь значение из / Attribute / Value, где Name = 'UPC' и Type = 'ComplexAttr'.

При первом запуске = 'Тестирование' & На втором прогоне значение должно быть = '24a'

Я пытаюсь использовать следующий код, но он не работает. Значение равно нулю.

<xsl:attribute name ="value">
    <xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][$i]/Value" />
</xsl:attribute>

где $ i - это переменная, которую я использую для циклического прохождения вышеупомянутого xml, и она увеличивается после каждого запуска. Тем не менее, это дает мне только то же значение « Testing » (которое является первым значением) при каждом запуске. Я проверил значение переменной. Он меняется каждый раз, когда проходит.

Я также пытался использовать current () и position (), как показано ниже, но в этом случае я получаю нулевое значение.

<xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][current()]/Value" />

<xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][position() = $i]/Value" />

Может кто-нибудь помочь мне с этим. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 13 апреля 2011

Это один из самых больших вопросов и ответов :

Оператор [] связывает сильнее, чем сокращение //.

Чтобы выбрать1-й элемент в документе XML, который удовлетворяет определенному условию в предикате, используйте :

(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[1]/Value

Чтобы выбрать 2-й элемент в документе XML, который удовлетворяет конкретномуусловие в предикате, используйте :

(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[2]/Value

Чтобы выбрать $i -й элемент в документе XML, который удовлетворяет определенному условию в предикате, используйте :

(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[position() = $i]/Value
2 голосов
/ 13 апреля 2011

Нельзя использовать переменную в выражении XPath. Попробуйте вручную использовать константу, и вы увидите, что она работает:

<xsl:value-of select=".//Attribute[Type='ComplexAttr' and Name='UPC'][2]/Value" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...