webentwicklung-frage-antwort-db.com.de

XSLT - Wie wähle ich XML-Attribute nach Attributen aus?

dies ist die Struktur meiner Quell-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>

woraus ich gerne einige Variablen erstellen möchte, z. von allen mit Value1 = "2" und allen mit Value1 = "5" sollte myVar1 mit anythingA2 und myVar2 mit anythingA5 resultieren

Mein Ansatz sieht so aus

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

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

danke für eventuelle hinweise im vorraus!

25
seansilver

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

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

Es gibt zwei Probleme mit Ihrem xpath - erstens müssen Sie die untergeordnete Auswahl nach Data entfernen, wie in phihag erwähnt. Außerdem haben Sie vergessen, root in Ihren xpath aufzunehmen. Folgendes möchten Sie tun:

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

Hinweis: Das Verwenden von // am Anfang des xpath ist etwas CPU-intensiv - es durchsucht jeden Knoten nach einer Übereinstimmung. Wenn Sie einen genaueren Pfad wie/root/DataSet verwenden, wird eine schnellere Abfrage erstellt.

1
pixel

Versuche dies

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

Das '//' sucht in jeder Tiefe nach DataSet

1
paul

Ich würde es tun, indem ich eine Variable erstelle, die auf die Knoten verweist, die den richtigen Wert in Wert1 haben und dann auf t verweisen

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

Die Antworten aller anderen sind auch richtig - eher richtig, 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 andere Dinge. Behalten Sie diese Methode in Ihrer Toolbox.

0