Der XPath bookstore/book[1]
wählt den ersten Buchknoten unter bookstore
.
Wie kann ich den ersten Knoten auswählen, der eine kompliziertere Bedingung erfüllt, z. B. den ersten Knoten, der mit /bookstore/book[@location='US']
Der XPath bookstore/book[1]
wählt den ersten Buchknoten unter bookstore
.
Wie kann ich den ersten Knoten auswählen, der eine kompliziertere Bedingung erfüllt, z. B. den ersten Knoten, der mit /bookstore/book[@location='US']
Verwendung:
(/bookstore/book[@location='US'])[1]
Damit werden zunächst die Buchelemente ermittelt, deren Standortattribut gleich "US" ist. Dann wird der erste Knoten aus dieser Menge ausgewählt. Beachten Sie die Verwendung von Klammern, die bei einigen Implementierungen erforderlich sind.
Beachten Sie, dass dies nicht dasselbe ist wie /bookstore/book[1][@location='US']
es sei denn, das erste Element hat zufällig auch dieses Ortsattribut.
/bookstore/book[@location='US'][1]
funktioniert nur bei einfacher Struktur.
Wenn man etwas mehr Struktur hinzufügt, bricht alles zusammen.
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 eine kompliziertere Bedingung erfüllt". /bookstore/category/book[@location='US'][2]
gibt nichts zurück.
Mit Klammern können Sie das Ergebnis erhalten, nach dem die ursprüngliche Frage gestellt wurde:
(/bookstore/category/book[@location='US'])[1]
donne
<book location="US">A1</book>
そして (/bookstore/category/book[@location='US'])[2]
funktioniert wie erwartet.
Zur Erläuterung der Antwort von Jonathan Fingland:
[position()=1 and @location='US']
) muss wahr sein in seiner Gesamtheit[position()=1][@location='US']
) muss wahr sein einer nach dem 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 zu [1]
Sie können komplexe Ausdrücke in Prädikaten mit den Booleschen Operatoren " and
" und " or
", und mit den booleschen XPath-Funktionen not()
, true()
y false()
. Außerdem können Sie Unterausdrücke in Klammern einschließen.
Der einfachste Weg, den ersten englischen Buchknoten (im gesamten Dokument) zu finden, ist unter Berücksichtigung einer komplizierter 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 ein 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>
In Anbetracht der obigen Ausführungen können Sie das erste Buch mit
(//book[@location='US'])[1]
Und damit wird der erste gefunden, der einen Standort in den USA hat. [A1]
//book[@location='US']
Würde den Knotensatz mit allen Büchern mit Standort US zurückgeben. [A1,B1,C2]
(//category/book[@location='US'])[1]
Gibt den ersten Buchstandort US zurück, der in einer Kategorie irgendwo im Dokument existiert. [B1]
(/bookstore//book[@location='US'])[1]
gibt das erste Buch mit dem Standort US zurück, das irgendwo unter dem Root-Element bookstore existiert; damit ist der Teil /bookstore eigentlich überflüssig. [A1]
Als direkte Antwort:
/bookstore/book[@location='US'][1]
Gibt Ihnen den ersten Knoten für das Element "Buch" mit dem Standort "US" zurück, der sich unter "Buchhandlung" befindet [A1].
Übrigens, wenn Sie in diesem Beispiel das erste US-Buch finden wollten, das nicht ein direktes Kind der Buchhandlung war:
(/bookstore/*//book[@location='US'])[1]
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.