XSLT - comment sélectionner un attribut XML par attribut?
voici 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 de laquelle j'aime créer quelques variables, par exemple à partir de toutes avec Value1="2" et toutes avec Value1="5" devrait résulter myVar1 avec anythingA2 et myVar2 avec anythingA5
Mon approche ressemble à ceci
<xsl:variable name="myVarA" select="/DataSet/Data/[@Value1='2']/@Value2" />
mais bien sûr ne fonctionne pas puisque Value2 n'est pas un enfant de Value1.
merci pour tous les conseils à l'avance!
5 réponses
il suffit d'enlever la barre oblique après Data
et la faire précéder de 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 d'après Data
comme phihag mentionné. Aussi, vous avez oublié d'inclure root
dans votre xpath. Ici est ce que vous voulez faire:
select="/root/DataSet/Data[@Value1='2']/@Value2"
Essayez ceci
xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" />
Le '/ / ' recherchera un ensemble de données à n'importe quelle profondeur
Note: utiliser // au début de xpath est un peu CPU intusitve -- il recherchera chaque noeud pour une correspondance. L'utilisation d'un chemin plus spécifique, tel que /root/DataSet, permettra de créer une requête plus rapide.
je le ferais en créant une variable qui pointe vers les noeuds qui ont la valeur appropriée dans la valeur1 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 tout le monde sont justes aussi - plus juste en fait puisque je n'ai pas remarqué le slash supplémentaire dans votre XPATH qui ferait tout foirer. Cependant , cela fonctionnera aussi, et pourrait fonctionner pour différentes choses, alors gardez cette méthode dans votre boîte à outils.