c'est la structure de mon xml source:
<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>
à partir duquel j'aime créer des variables, par ex. de tous avec Value1 = "2" et tous avec Value1 = "5" devrait résulter myVar1 avec n'importe quoiA2 et myVar2 avec n'importe quoiA5
Mon approche ressemble à ceci
<xsl:variable name="myVarA" select="/DataSet/Data/[@Value1='2']/@Value2" />
mais bien sûr ne fonctionne pas car Value2 n'est pas un enfant de Value1.
merci pour tout indice à l'avance!
Supprimez simplement la barre oblique après Data
et ajoutez la racine:
<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/>
Il y a deux problèmes avec votre xpath - vous devez d'abord supprimer le sélecteur d'enfant après Data
comme phihag mentionné. Vous avez également oublié d'inclure root
dans votre xpath. Voici ce que vous voulez faire:
select="/root/DataSet/Data[@Value1='2']/@Value2"
Remarque: l'utilisation de // au début du xpath est un peu gourmande en CPU - elle recherchera une correspondance pour chaque nœud. L'utilisation d'un chemin plus spécifique, tel que/root/DataSet, créera une requête plus rapide.
Essaye ça
xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" />
Le '//' recherchera DataSet à n'importe quelle profondeur
Je le ferais en créant une variable qui pointe vers les nœuds qui ont la valeur appropriée dans Value1 puis en se référant à t
<xsl:variable name="myVarANode" select="root//DataSet/Data[@Value1='2']" />
<xsl:value-of select="$myVarANode/@Value2"/>
Les réponses de tous les autres sont exactes aussi - plus exactes en fait, car je n'ai pas remarqué la barre oblique supplémentaire dans votre XPATH qui gâcherait les choses. Néanmoins, cela fonctionnera également et pourrait fonctionner pour différentes choses, alors conservez cette méthode dans votre boîte à outils.