wake-up-neo.com

XPath-Abfrage zum Abrufen der n-ten Instanz eines Elements

Es gibt eine HTML-Datei (deren Inhalt ich nicht kontrolliere), die mehrere input Elemente mit demselben festen id Attribut von "search_query" Enthält. Der Inhalt der Datei kann sich ändern, aber ich weiß, dass ich immer das zweite input -Element mit dem ID-Attribut "search_query" Erhalten möchte.

Ich brauche einen XPath-Ausdruck, um dies zu tun. Ich habe versucht //input[@id="search_query"][2], Aber das funktioniert nicht. Hier ist eine XML-Beispielzeichenfolge, bei der diese Abfrage fehlgeschlagen ist:

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

Denken Sie daran, dass das Obige nur ein Beispiel ist und der andere HTML-Code sehr unterschiedlich sein kann und die input -Elemente überall ohne konsistente Dokumentstruktur auftreten können (mit der Ausnahme, dass garantiert immer mindestens zwei vorhanden sind) input Elemente mit dem ID-Attribut "search_query").

Was ist der richtige XPath-Ausdruck?

117
rlandster

Dies ist eine FAQ:

//somexpression[$N]

bedeutet "Finde jeden von //somexpression das ist der $Nth Kind seines Elternteils ".

Was Sie wollen, ist:

(//input[@id="search_query"])[2]

Erinnern Sie sich: Das [] Operator hat höhere Priorität (Priorität) als der // Abkürzung.

206

Das scheint zu funktionieren:

/descendant::input[@id="search_query"][2]

Ich gehe davon aus "XSLT 2.0 und XPath 2.0 Programmer's Reference, 4th Edition" von Michael Kay.

Es gibt auch einen Hinweis im Abschnitt "Abgekürzte Syntax" der XML Path Language-Spezifikation http://www.w3.org/TR/xpath/#path-abbrev , der einen Hinweis lieferte.

15
rlandster