XPath peut-il renvoyer uniquement les nœuds ayant un enfant de X?
Question
Est-il possible d’utiliser XPath pour sélectionner uniquement les nœuds ayant un élément enfant particulier? Par exemple, à partir de ce XML, je ne veux que les éléments des animaux de compagnie qui ont un enfant de 'bar'. Ainsi, l'ensemble de données résultant contiendrait les éléments lizard
et pig
de cet exemple:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>return pig, too</bar>
</pig>
</pets>
Ce Xpath me donne tous les animaux: "/ pets / *"
, mais je ne veux que les animaux qui ont un nœud enfant de nom 'bar'
.
La solution
Le voici dans toute sa splendeur
/pets/*[bar]
Français: donnez-moi tous les enfants de animaux de compagnie
qui ont une barre d'enfants
Autres conseils
/pets/child::*[child::bar]
Désolé, je n'ai pas vu les commentaires de la réponse précédente.
Mais dans ce cas, je préférerais utiliser l'axe descendant ::
, qui inclut tous les éléments à partir de celui spécifié:
/pets[descendant::bar]
Juste au cas où vous voudriez être plus précis sur les enfants - vous pouvez également utiliser des sélecteurs sur eux.
Exemple:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>don't return pig - it has no att=bar </bar>
</pig>
</pets>
Désormais, vous ne vous souciez que de tous les animaux
ayant une barre enfant
ayant un attribut att
avec la valeur baz
. Vous pouvez utiliser l'expression xpath suivante:
//pets/*[descendant::bar[@att='baz']]
Résultat
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>