2008-09-19 8 views
32

Ist es möglich, XPath zu verwenden, um nur die Knoten auszuwählen, die bestimmte untergeordnete Elemente haben? Zum Beispiel möchte ich von diesem XML nur die Elemente in Haustieren, die ein Kind von 'bar' haben. So würde die resultierende Datenmenge enthalten die lizard und pig Elemente aus diesem Beispiel:Kann XPath nur Knoten zurückgeben, die ein Kind von X haben?

<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> 

Dieser XPath gibt mir alle Haustiere: "/pets/*", aber ich möchte nur die Tiere, die einen untergeordneten Knoten des Namens 'bar' haben.

+1

Sie die w3c-Spezifikationen in Bezug auf die Lesbarkeit und Nützlichkeit nicht unterschätzen. Es ist wahrscheinlich schneller, die Antworten auf Fragen wie diese in the spec zu suchen, die sehr lesbar und vollständig ist, mit vielen Beispielen. – Confusion

Antwort

45

Hier ist sie, in all seiner Pracht

/pets/*[bar] 

Englisch: Gib mir alle Kinder von pets, die ein Kind haben bar

21
/pets/child::*[child::bar] 

Meine Verzeihung, ich habe nicht die Kommentare zu den vorherige Antwort.

Aber in diesem Fall würde ich eher die descendant:: Achse lieber mit, die alle Elemente enthält unten von spezifizierten:

/pets[descendant::bar] 
4

Gerade falls Sie präziser über die Kinder sein wollte - Sie auch verwenden können Selektoren auf ihnen.

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 nur kümmert sich um alle pets jedes Kind mit bar, die ein Attribut att mit Wert baz hat. Sie können die 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> 
+0

Wie wäre es mit allen Haustieren, die Element hat spezifischen Text()? Scheint so, als könnte ich das nicht herausfinden ... – jeremfg

Verwandte Themen