Antworten:
Verwenden:
(/bookstore/book[@location='US'])[1]
Dadurch werden zuerst die Buchelemente mit dem Standortattribut 'US' abgerufen. Dann wird der erste Knoten aus diesem Satz ausgewählt. Beachten Sie die Verwendung von Klammern, die für einige Implementierungen erforderlich sind.
Beachten Sie, dass dies nicht dasselbe ist, es /bookstore/book[1][@location='US']
sei denn, das erste Element hat zufällig auch dieses Standortattribut.
/bookstore/book[@location='US'][1]
gibt nicht alle Bücher aus 'US' zurück. Ich habe es mehrmals und unter den xpath-Implementierungen verschiedener Sprachen getestet. /bookstore/book[@location='US'][1]
gibt das erste "US" -Buch unter einem Buchladen zurück. Wenn es mehrere Buchhandlungen gibt, wird die erste von jeder zurückgegeben. Dies ist, was das OP angefordert hat (der erste Knoten unter dem Buchladen). Ihre Version gibt nur ein Buch aus allen Buchhandlungen zurück (das erste Spiel).
/bookstore/book[@location='US'][1]
funktioniert nur mit einfacher Struktur.
Fügen Sie etwas mehr Struktur hinzu und die Dinge brechen.
Mit
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
/bookstore/category/book[@location='US'][1]
ergibt
<book location="US">A1</book>
<book location="US">B2</book>
nicht "der erste Knoten, der einer komplizierteren Bedingung entspricht". /bookstore/category/book[@location='US'][2]
gibt nichts zurück.
Mit Klammern können Sie das Ergebnis erhalten, für das die ursprüngliche Frage war:
(/bookstore/category/book[@location='US'])[1]
gibt
<book location="US">A1</book>
und (/bookstore/category/book[@location='US'])[2]
funktioniert wie erwartet.
/bookstore/book[1]
und NICHT (/bookstore/book)[1]
. Der von Ihnen angegebene Fall ist nicht derselbe wie der, nach dem Sie gefragt haben. Vermutlich akzeptierte OP meine Antwort so, wie er es erwartet (und angefordert) hatte.
'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. Falls viele Knoten übereinstimmen name
.
Als Erklärung zu Jonathan Finglands Antwort:
[position()=1 and @location='US']
) müssen als Ganzes wahr sein[position()=1][@location='US']
) müssen wahr sein , eine nach der anderen[position()=1][@location='US']
! = [@location='US'][position()=1]
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
kann abgekürzt werden[1]
Sie können komplexe Ausdrücke in Prädikaten mit den Booleschen Operatoren „bauen and
“ und „ or
“, und mit den Booleschen XPath - Funktionen not()
, true()
und false()
. Außerdem können Sie Unterausdrücke in Klammern setzen.
Der einfachste Weg, den ersten englischen Buchknoten (im gesamten Dokument) zu finden, unter Berücksichtigung einer komplizierteren strukturierten XML-Datei wie:
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
ist xpath Ausdruck:
/descendant::book[@location='US'][1]
<bookstore>
<book location="US">A1</book>
<category>
<book location="US">B1</book>
<book location="FIN">B2</book>
</category>
<section>
<book location="FIN">C1</book>
<book location="US">C2</book>
</section>
</bookstore>
Also angesichts der oben genannten; Sie können das erste Buch mit auswählen
(//book[@location='US'])[1]
Und dies wird der erste sein, der irgendwo einen Standort in den USA hat. [A1]
//book[@location='US']
Würde den Knoten zurückgeben, der mit allen Büchern mit dem Speicherort US festgelegt wurde. [A1, B1, C2]
(//category/book[@location='US'])[1]
Würde den ersten Buchspeicherort US zurückgeben, der in einer Kategorie irgendwo im Dokument vorhanden ist. [B1]
(/bookstore//book[@location='US'])[1]
gibt das erste Buch mit dem Speicherort US zurück, das sich irgendwo unter dem Root-Element-Buchladen befindet; den / bookstore-Teil wirklich überflüssig machen. [A1]
In direkter Antwort:
/bookstore/book[@location='US'][1]
Gibt Ihnen den ersten Knoten für das Buchelement mit dem Speicherort US zurück, der sich unter der Buchhandlung [A1] befindet.
Übrigens, wenn Sie wollten, finden Sie in diesem Beispiel das erste US-Buch, das kein direktes Kind der Buchhandlung war:
(/bookstore/*//book[@location='US'])[1]
Verwenden Sie den Index, um den gewünschten Knoten zu erhalten, wenn xpath kompliziert ist oder mehr als ein Knoten mit demselben xpath vorhanden ist.
Ex :
(//bookstore[@location = 'US'])[index]
Sie können die Nummer angeben, welchen Knoten Sie möchten.
zum Beispiel.
<input b="demo">
Und
(input[@b='demo'])[1]
Mit Hilfe eines Online- Xpath-Testers schreibe ich diese Antwort ...
Dafür:
<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>
der folgende xpath:
id("t2") / tbody / tr / td[1]
Ausgänge:
123
foo
bar
xyz
Da 1 bedeutet, wählen Sie alle td- Elemente aus, die das erste Kind ihres eigenen direkten Elternteils sind.
Aber der folgende xpath:
(id("t2") / tbody / tr / td)[1]
Ausgänge:
123