2009-02-12 11 views
23

to jest struktura moje źródło xml:XSLT - Jak wybrać atrybut XML według atrybutu?

<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> 

z którego chcesz utworzyć kilka zmiennych np z każdego z Wartość1 = „2” i wszystkie z Wartość1 = „5” powinien spowodować myVar1 z anythingA2 i myVar2 z anythingA5

Moja approch wygląda to

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

ale oczywiście nie działa od WartoÊç2 jest żadne dziecko z Value1.

dzięki za wszelkie wskazówki z góry!

Odpowiedz

44

Wystarczy usunąć ukośnik po Data i poprzedzić korzeń:

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

-1 to nie działa bez węzła głównego –

+0

@Andrew Hare: Poprawione. Dzięki Quassnoi za opracowanie, straciłem połączenie natychmiast po opublikowaniu pierwszej wersji. – phihag

4

Istnieją dwa problemy z XPath - najpierw trzeba usunąć selektor dziecko od po Data jak phihag wymienione. Również zapomniałeś dodać root do swojej ścieżki xpath. Oto, co chcesz zrobić:

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

Spróbuj

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

The „//” wyszuka DataSet na każdej głębokości

0

zrobiłbym to tworząc zmienną że punkty do węzłów, które mają poprawną wartość w Wartość1, a ​​następnie odnosząc się do t Wszystkie odpowiedzi innych też są poprawne - mo w rzeczywistości, ponieważ nie zauważyłem dodatkowego skrótu w twojej XPATH, który mógłby zepsuć sytuację. Nadal będzie to działało i może działać na różne sposoby, więc zachowaj tę metodę w swoim przyborniku.

+0

Czy hipoteza jest 1, 2, 3? Mam Nazwa albumu Wykonawca A Artist b>, a ja staram się zaznaczyć wszystkie rodzeństwa artystów i związać je do tabeli pośredniczącej podłączonego do albumu, bez konieczności duplikaty artystów z mojej ogromnej bazy danych. Jakieś pomysły? –

2

Uwaga: używanie // na początku ścieżki x jest nieco intensywniejsze CPU - przeszuka każdy węzeł pod kątem dopasowania. Używanie bardziej specyficznej ścieżki, takiej jak/root/DataSet, utworzy szybsze zapytanie.

+4

Ponieważ to nie odpowiada na pytanie, powinno być komentarzem do pytania PO. –

Powiązane problemy