2009-02-12 4 views
23

это структура моего источника XML:XSLT - Как выбрать атрибут 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 с anythingA2 и myVar2 с anythingA5

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

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

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

благодарит за любые намеки!

ответ

44

Просто удалите слэш после Data и предварять корень:

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

-1 это не работает без корневого узла –

+0

@Andrew Hare: Исправлено. Благодаря Quassnoi для разработки, я потерял связь сразу после публикации первой ревизии. – phihag

4

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

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

Попробуйте

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

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

0

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

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

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

+0

Является ли гипотеза 1, 2, 3? У меня Альбома Исполнителя A Исполнителя B>, и я стараюсь, чтобы выбрать все родной брат художников и привязать их к промежуточной таблице, подключенной к альбому, без дублирующих художников из моих огромной базы данных. Есть идеи? –

2

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

+4

Поскольку это не отвечает на вопрос, это должен быть комментарий к вопросу ОП. –

Смежные вопросы