2009-02-12 6 views
23

ist dies die Struktur meiner Quelle xml:XSLT - So wählen Sie XML-Attribut nach Attribut aus?

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

aus dem ich zum Beispiel einige Variablen erstellen möchten von allen mit Value1 = „2“ und alle mit Value1 = „5“ sollte MyVar1 mit anythingA2 und MyVar2 mit anythingA5 führen

Meine approch wie diese

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

aber natürlich nicht funktioniert, da Value2 aussieht, ist kein Kind von Value1.

danke für irgendwelche Hinweise im Voraus!

Antwort

44

Entfernen Sie einfach den Schrägstrich nach Data und prepend die Wurzel:

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

-1 dies funktioniert nicht ohne den Wurzelknoten –

+0

@Andrew Hare: Korrigiert. Dank Quassnoi für die Ausarbeitung, verlor ich sofort nach dem Posten der ersten Revision die Verbindung. – phihag

4

Es gibt zwei Probleme mit Ihrem XPath - zuerst müssen Sie nach Data wie phihag erwähnt das Kind Selektor entfernen. Sie haben auch vergessen, root in Ihrem xpath einzuschließen. Hier ist, was Sie tun möchten:

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

Versuchen Sie, diese

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

Die ‚//‘ wird in jeder Tiefe für DataSet suchen

0

Ich würde es tun, indem Sie eine Variable erstellen, die Punkte zu den Knoten, die den richtigen Wert in Value1 haben dann Bezug auf t

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

Alle anderen Antworten sind auch richtig - mo Genau in der Tat, da ich den zusätzlichen Schrägstrich in Ihrem XPATH nicht bemerkt habe, der die Dinge durcheinander bringen würde. Dies funktioniert jedoch auch und funktioniert möglicherweise für verschiedene Dinge. Bewahren Sie diese Methode in Ihrer Toolbox auf.

+0

Ist das 1, 2, 3 Zeug hypothetisch? Ich habe Album Namen Künstler A Künstler B> bekam und ich versuche, alle Geschwister Künstler auszuwählen und sie zu einem Zwischentisch mit dem Album verbunden zu binden, ohne doppelten Künstler aus meiner riesigen Datenbank. Irgendwelche Ideen? –

2

Hinweis: die Verwendung von // am Anfang des Xpath ist ein bisschen CPU-Intensität - es wird jeden Knoten nach einer Übereinstimmung suchen. Wenn Sie einen spezifischeren Pfad verwenden, wie z. B./root/DataSet, wird eine schnellere Abfrage erstellt.

+4

Da dies die Frage nicht beantwortet, sollte es ein Kommentar zur Frage des OP sein. –