Kann XPath nur Knoten zurück, die ein Kind von X?
Frage
Ist es möglich, XPath zu verwenden nur die Knoten auszuwählen, die ein bestimmtes Kind-Elemente haben? Zum Beispiel aus dieser XML mag ich nur die Elemente in Haustieren, die ein Kind von ‚bar‘ haben. So ist die resultierende Datenmenge der lizard
und pig
Elemente aus diesem Beispiel enthalten würde:
<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>
Dieses Xpath gibt mir alle Haustiere: "/pets/*"
, aber ich möchte nur die Tiere, die einen untergeordneten Knoten des Namens 'bar'
haben
Lösung
Hier ist er, in seiner ganzen Pracht
/pets/*[bar]
Englisch: Gib mir alle Kinder von pets
, die ein Kind bar
haben
Andere Tipps
/pets/child::*[child::bar]
Meine Verzeihung, ich habe nicht die Kommentare der vorherigen Antwort.
Aber in diesem Fall würde ich eher vorziehen, die descendant::
Achse verwenden, die alle Elemente nach unten aus dem angegebenen beinhaltet:
/pets[descendant::bar]
Für den Fall, Sie wollten mehr spezifisch über die Kinder sein -. Sie auch Selektoren auf sie verwenden können
Beispiel:
<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>
Nun, Sie kümmern sich nur um alle pets
jedes Kind bar
mit , die ein Attribut att
mit Wert hat baz
. Sie können den folgenden XPath-Ausdruck verwenden:
//pets/*[descendant::bar[@att='baz']]
Ergebnis
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>