Ada file HTML (yang isinya saya tidak kontrol) yang memiliki beberapa input
elemen semua dengan id
atribut tetap yang sama "search_query"
. Isi file dapat berubah, tetapi saya tahu bahwa saya selalu ingin mendapatkan input
elemen kedua dengan atribut id "search_query"
.
Saya perlu ekspresi XPath untuk melakukan ini. Saya mencoba //input[@id="search_query"][2]
tetapi itu tidak berhasil. Berikut adalah contoh string XML di mana kueri ini gagal:
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
Perlu diingat bahwa di atas hanyalah sebuah contoh dan kode HTML lainnya dapat sangat berbeda dan input
elemen dapat muncul di mana saja tanpa struktur dokumen yang konsisten (kecuali bahwa saya dijamin akan selalu ada setidaknya dua input
elemen dengan atribut id dari "search_query"
).
Apa ekspresi XPath yang benar?
Jawaban:
Ini adalah FAQ :
//somexpression[$N]
berarti "Temukan setiap simpul yang dipilih oleh
//somexpression
itu adalah$N
anak ke-2 dari induknya".Yang Anda inginkan adalah :
Ingat :
[]
Operator memiliki prioritas lebih tinggi (prioritas) daripada//
singkatan.sumber
//input[@id='search_query'][2]
/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
Ini sepertinya berhasil:
Saya menggunakan ini dari "Referensi Programmer XSLT 2.0 dan XPath 2.0, Edisi ke-4" oleh Michael Kay.
Ada juga catatan di bagian "Sintaks Singkat" dari spesifikasi Bahasa Jalur XML http://www.w3.org/TR/xpath/#path-abbrev yang memberikan petunjuk.
sumber