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?


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

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


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

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.


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.