Подтвердить что ты не робот

XSLT - Как выбрать атрибут XML по атрибуту?

это структура моего исходного xml:

<root>
<DataSet Value="A">
<Data Value1="1" Value2="anythingA1" />
<Data Value1="2" Value2="anythingA2" />
<Data Value1="3" Value2="anythingA3" />
<Data Value1="4" Value2="anythingA4" />
<Data Value1="5" Value2="anythingA5" />
</DataSet>
</root>

из которого мне нравится создавать некоторые переменные, например. из всех с Value1 = "2", а все с Value1 = "5" должны приводить myVar1 к чему-либо A2 и myVar2 с чем угодно A5

Мой афиш выглядит следующим образом

<xsl:variable name="myVarA" select="/DataSet/Data/[@Value1='2']/@Value2" />

но, конечно, не работает, поскольку Value2 не является дочерним элементом Value1.

спасибо за любые подсказки заранее!

4b9b3361

Ответ 1

Просто удалите косую черту после Data и добавьте корень:

<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/>

Ответ 2

У вас есть две проблемы с вашим xpath - сначала вам нужно удалить дочерний селектор после Data, как упомянуто выше, в phihag. Также вы забыли включить root в свой xpath. Вот что вы хотите сделать:

select="/root/DataSet/Data[@Value1='2']/@Value2"

Ответ 3

Примечание: использование//в начале xpath немного интенсивно CPU - он будет искать каждый node для соответствия. Использование более конкретного пути, например /root/DataSet, создаст более быстрый запрос.

Ответ 4

Попробуйте это

xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" />

"//" будет искать DataSet на любой глубине

Ответ 5

Я бы сделал это, создав переменную, которая указывает на узлы, которые имеют правильное значение в Value1, а затем ссылаются на t

<xsl:variable name="myVarANode" select="root//DataSet/Data[@Value1='2']" />
<xsl:value-of select="$myVarANode/@Value2"/>

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