2016-09-05 3 views
1

XMLXPath für die sofortigen vorhergehenden Geschwister

<root> 
    <p>nodea text 1</p> 
    <p>nodea text 2</p> 
    <nodea> 
    </nodea> 
    <p>nodeb text 1</p> 
    <p>nodeb text 2</p> 
    <nodeb> 
    </nodeb> 
</root> 

Ich mag den ersten vorhergehenden Geschwister p-Tag von NodeA oder NodeB erhalten, wenn es einen gibt. Zum Beispiel für den obigen XML die vorhergehenden Geschwistern für die jeweiligen Knoten sind

NodeA vorhergehenden Geschwister

<p>nodea text 1</p> 
<p>nodea text 2</p> 

NodeB vorhergehenden Geschwister

<p>nodeb text 1</p> 
<p>nodeb text 2</p> 

i die unten XPath versucht haben, aber es gibt mir die vorangehende p-Markierung von nodea anstelle von nodeb.

Wenn vor dem Knoten kein vorangestelltes p-Tag vorhanden ist, sollte eine leere Liste zurückgegeben werden. Zum Beispiel gibt es für das untere xml keine vorhergehenden Geschwister-p-Tags für nodeb.

<root> 
    <p>nodea text 1</p> 
    <nodea> 
    </nodea> 
    <nodeb> 
    </nodeb> 
</root> 

Es wäre schön, wenn jemand erklären kann, auch, warum meine XPath nicht funktioniert und was soll ich beachten, wenn XPath zu schreiben?

Antwort

3

Sie können preceding-sibling::*[1][self::p] auswählen, um das vorhergehende Geschwisterelement auszuwählen, wenn es sich um ein Element handelt.

Was Ihre Versuch, denke ich, wenn Sie das nodeb Element wählen Sie dann preceding-sibling::p[preceding-sibling::nodea][1] auswählen möchten, wie Sie an der Geschwister p s aussehen soll, die zwischen dem nodeb und dem nodea Element sind. Ihre Bedingung preceding-sibling::p[not(preceding-sibling::nodea)][1] wählt in der Tat Geschwister, die keine vorhergehenden nodea Geschwister haben, und das sind die ersten beiden p Elemente in der Reihenfolge der Dokumente.

+0

Es funktioniert. Kannst du bitte ein wenig Erklärung hinzufügen, was mit meinem XPath nicht stimmt. – MA1

+0

@ MA1, ich habe eine Erklärung für Ihren Versuch hinzugefügt. –

Verwandte Themen