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!

24
demandé sur Deduplicator 2009-02-12 17:05:45

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"/>
45
répondu phihag 2009-02-12 14:37:17

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"
4
répondu Andrew Hare 2009-02-12 14:12:50

Essayez ceci

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

Le '/ / ' recherchera un ensemble de données à n'importe quelle profondeur

1
répondu paul 2009-02-12 14:16:18

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.

1
répondu pixel 2009-02-12 14:46:54

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.

0
répondu Stephen Friederichs 2009-02-12 14:35:09