XSLT - Как выбрать атрибут XML по атрибуту? - PullRequest
25 голосов
/ 12 февраля 2009

это структура моего источника 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.

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

Ответы [ 5 ]

47 голосов
/ 12 февраля 2009

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

<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/>
4 голосов
/ 12 февраля 2009

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

select="/root/DataSet/Data[@Value1='2']/@Value2"
1 голос
/ 12 февраля 2009

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

1 голос
/ 12 февраля 2009

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

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

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

0 голосов
/ 12 февраля 2009

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

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

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

...