397 Stimmen

So wählen Sie das erste Element mit einem bestimmten Attribut mit XPath aus

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

573voto

Jonathan Fingland Punkte 54655

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.

207voto

tkurki Punkte 1949

/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.

62voto

Tomalak Punkte 320467

Zur Erläuterung der Antwort von Jonathan Fingland:

  • mehrere Bedingungen in demselben Prädikat ( [position()=1 and @location='US'] ) muss wahr sein in seiner Gesamtheit
  • mehrere Bedingungen in aufeinanderfolgenden Prädikaten ( [position()=1][@location='US'] ) muss wahr sein einer nach dem anderen
  • Dies bedeutet, dass [position()=1][@location='US'] != [@location='US'][position()=1]
    während [position()=1 and @location='US'] == [@location='US' and position()=1]
  • Hinweis: ein einsamer [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.

16voto

Gee-Bee Punkte 3185

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]

12voto

iZian Punkte 323
    <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.com

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.

Powered by:

X