2008-09-26 4 views
4

Dire que j'ai le code XML suivant ...XPath peut-il effectuer une recherche de clé étrangère sur deux sous-arborescences d'un fichier XML?

<root> 
    <base> 
    <tent key="1" color="red"/> 
    <tent key="2" color="yellow"/> 
    <tent key="3" color="blue"/> 
    </base> 
    <bucket> 
    <tent key="1"/> 
    <tent key="3"/> 
    </bucket> 
</root> 

... quel serait le XPath être qui retourne que le « seau » contient « rouge » et « bleu »?

+1

L'expression XPath dans la réponse actuellement acceptée ne sélectionne aucun noeud "bucket". Il sélectionne les attributs "couleur". Donc, cette réponse est fausse. dacracot, s'il vous plait, acceptez la réponse de Jeni, qui est bonne –

Répondre

5

Si vous utilisez XSLT, je vous recommande la mise en place d'une clé:

<xsl:key name="tents" match="base/tent" use="@key" /> 

Vous pouvez alors obtenir le <tent> au sein <base> avec un key particulier à l'aide

key('tents', $id) 

Ensuite, vous pouvez faire

key('tents', /root/bucket/tent/@key)/@color 

ou, si $bucket est un élément <bucket> particulier,

key('tents', $bucket/tent/@key)/@color 
2

Je pense que cela va fonctionner:

/root/base/tent[/root/bucket/tent/@key = @key ]/@color 
+0

Le xpath fonctionne pour le XML donné mais n'est pas une solution générique. Si le XML est: ... snip ... alors il retournera les trois couleurs. –

+0

Cette expression XPath ne sélectionne aucun noeud "bucket". Il sélectionne les attributs "couleur". Donc, cette réponse est fausse. dacracot, s'il vous plaît, acceptez la réponse de Jeni, qui est bonne. –

1

Ce n'est pas assez. Comme pour toute recherche, vous devez utiliser current():

/root/seau [/ root/base/tente [@key = current()/tente/@ clé]/@ color = 'blue' ou/racine/base/tente [@key = courant()/tente/@ key]/@ color = 'rouge']

0

JeniT a la réponse appropriée/code indiqué ici. Vous devez créer la clé avant de parcourir le document XML, puis effectuer des correspondances avec cette clé.

Questions connexes