web-dev-qa-db-fra.com

XSLT - Comment sélectionner un attribut XML par attribut?

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!

25
seansilver

Supprimez simplement la barre oblique après Data et ajoutez la racine:

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

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"
4
Andrew Hare

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.

1
pixel

Essaye ça

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

Le '//' recherchera DataSet à n'importe quelle profondeur

1
paul

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.

0
Stephen Friederichs