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!
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"/>
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"
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.
Versuche dies
xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" />
Das '//' sucht in jeder Tiefe nach DataSet
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.