web-dev-qa-db-ja.com

要素のn番目のインスタンスを取得するXPathクエリ

すべてが"search_query"の同じ固定input属性を持ついくつかのid要素を持つHTMLファイル(そのコンテンツは私が制御しません)があります。ファイルの内容は変更される可能性がありますが、id属性"search_query"を持つ2番目のinput要素を常に取得したいことを知っています。

これを行うにはXPath式が必要です。 //input[@id="search_query"][2]を試しましたが、うまくいきません。このクエリが失敗したXML文字列の例を次に示します。

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

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

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

上記は単なる例であり、他のHTMLコードはまったく異なる可能性があり、input要素は一貫したドキュメント構造なしでどこにでも表示できることに注意してください(ただし、少なくとも2つのinput id属性が"search_query")の要素。

正しいXPath式は何ですか?

117
rlandster

これはFAQです

//somexpression[$N]

//somexpressionで選択されたすべてのノードを検索します。これは、その親の$Nth子です。

必要なものは

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

覚えておく[]演算子は、//の略語よりも高い優先度(優先度)を持っています。

206

これはうまくいくようです:

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

これは、Michael Kayの「XSLT 2.0およびXPath 2.0プログラマーズリファレンス、第4版」から引用しています。

また、XMLパス言語の仕様の「短縮構文」セクションに、手がかりを提供するメモがあります http://www.w3.org/TR/xpath/#path-abbrev

15
rlandster