Wie wähle ich einen Knoten mit XPath aus, wenn der Geschwisterknoten einen bestimmten Wert hat?

85

Ich habe folgendes Dokument:

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>

Wie kann ich den Wert der <cc>Verwendung von XPath ermitteln, wenn dies der Fall <bb>ist zz?

HOE SENGKIANG
quelle
1
Das Problem ist, dass ich weiß, wie man auf einen bestimmten Knoten zugreift, aber ich habe keine Ahnung, auf einen Knoten zuzugreifen, wenn ein Geschwister einen bestimmten Wert hat. Kann es so etwas sein, das / a / cc / enthält (/ a / bb = 'zz')?
HOE SENGKIANG

Antworten:

96

Sie sind sich nicht sicher, warum alle nach Geschwistern fragen. Sie können auch nach <bb/>Elementen suchen, die mit dem Prädikat des Prädikats übereinstimmen <a/>:

//a[bb/text() = "zz"]/cc/text()
Jens Erat
quelle
20
"Nicht sicher, warum alle nach Geschwistern fragen " : Vielleicht, weil die Frage für Geschwister war .. ;-)
hr_117
4
Scheint, als hätte ich den Titel nicht gelesen. :) Antwort bleibt trotzdem gültig.
Jens Erat
2
Ihre Antwort fragt auch nach Geschwistern. Sie haben einfach keine *-siblingAchse verwendet. +1 obwohl.
LarsH
Dies beantwortet die Frage nicht, aber es beantwortet meine eigentliche Frage, die ich schlecht formuliert habe. Danke dir!
User9213
35

Was Sie brauchen, ist die following-siblingXPath-Achse

//a/bb[text()="zz"]/following-sibling::cc[1]/text()

Testen Sie den Xpath hier: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625

Stanley
quelle
4
@HOESENGKIANG: Sie sollten auf das Häkchen klicken, um diese Antwort zu "akzeptieren", oder je nachdem, was Ihrer Meinung nach die Frage am besten beantwortet.
LarsH
22

F: Wie wähle ich einen Knoten mit XPath aus, wenn der Geschwisterknoten einen bestimmten Wert hat?
Da es nur "XPath-Achsen" für Folgeschwister und Vorgeschwister gibt, können Sie eine davon verwenden, wenn die Position festgelegt ist.

Aber besser: Suchen Sie, wo ccder Elternteil ein Kind bbmit Wert hat 'zz':

//cc[../bb='zz']
hr_117
quelle
6
Entweder das oder //a[bb = 'zz']/cc.
Tomalak
Ich bin mir nicht sicher, was Sie unter "nur" XPath-Achsen "für Nachgeschwister und Vorgeschwister" verstehen. Beziehen Sie sich auf die Tatsache, dass es keine einzige Achse für alle Geschwister gibt?
LarsH
@LarsH: Ja, sorry, (entschuldigen Sie mein schlechtes Englisch :-() - das wollte ich sagen. (Weil die Frage für Geschwister war.)
hr_117
6

Zunächst einmal ist Ihr Beispiel kein wohlgeformtes XML. Mit Blick darauf und dass Sie Ihre Absichten nicht sehr gut beschrieben haben (Was genau möchten Sie unter welchen Bedingungen auswählen?), Nehme ich an, dass Sie dies tun möchten:

//cc[preceding-sibling::bb[text()="zz"]]/text()

Es wählt aus

TEXT VALUES OF ALL <CC> ELEMENTS
//cc                                    /text()
    THAT HAVE A PRECEDING SIBLING <BB>
    [preceding-sibling::bb             ]
                          THAT HAS TEXT VALUE EQUAL TO "zz"
                          [text()="zz"]

Man könnte auch schreiben wie

//bb[text()="zz"]/following-sibling::cc/text()

Bitte schauen Sie sich die Spezifikation an , sie enthält einige sehr gut lesbare Beispiele, aus denen Sie viel lernen werden.

Petr Janeček
quelle
1
@LarsH Danke für die Korrektur von "ungültig" zu "nicht wohlgeformt". Ich habe heute etwas Neues gelernt.
Petr Janeček
4
//a/cc[../bb='zz']/text()

// a: Wählt alle 'a'-Elemente aus, egal wo sie sich befinden.

// a / cc: Wählt 'cc'-Elemente aus, die Kinder des' a'-Elements sind (egal wo a ist).

..: Wählt das übergeordnete Element des aktuellen Knotens aus.

[../bb='zz ']: wobei der Wert des Geschwisterelements' bb 'zz ist.

Referenz: http://www.w3schools.com/xsl/xpath_syntax.asp

Bae Cheol Shin
quelle
3

Eine andere Lösung für dieses Problem ist

//bb[contains(.,'zz')]/../cc/text()

Erläuterung : Alle bb, die 'zz'Zeichenfolgen in allen untergeordneten Knoten enthalten, um bbdann zum übergeordneten Knoten dieser zu bbwechseln .., nachdem wir auf den ccso zurückgegebenen Text zugreifen können .

Ich hoffe, dass die Erklärung nicht komplex ist.

Saleh Mahmood
quelle