Ini untuk XPath 1.0. Jika lingkungan Anda mendukung XPath 2.0, lihat di sini .
Iya. Mungkin, tapi tidak cantik.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
Ini akan berfungsi untuk string pencarian di mana alfabet diketahui sebelumnya. Tambahkan karakter beraksen yang ingin Anda lihat.
Jika Anda bisa, tandai teks yang Anda minati dengan cara lain, seperti melampirkannya di dalam <span>
yang memiliki kelas tertentu saat membangun HTML. Hal semacam itu jauh lebih mudah ditemukan dengan XPath daripada substring dalam teks elemen.
Jika itu bukan pilihan, Anda dapat mengizinkan JavaScript (atau bahasa host lain yang Anda gunakan untuk menjalankan XPath) membantu Anda membuat ekspresi XPath dinamis:
function xpathPrepare(xpath, searchString) {
return xpath.replace("$u", searchString.toUpperCase())
.replace("$l", searchString.toLowerCase())
.replace("$s", searchString.toLowerCase());
}
xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
(Tip tip untuk jawaban @ KirillPolishchuk - tentu saja Anda hanya perlu menerjemahkan karakter yang sebenarnya Anda cari .)
Pendekatan ini akan bekerja untuk string pencarian apa pun, tanpa memerlukan pengetahuan sebelumnya tentang alfabet, yang merupakan nilai tambah yang besar.
Kedua metode di atas gagal ketika string pencarian dapat berisi tanda kutip tunggal, dalam hal ini segalanya menjadi lebih rumit .
translate()
sendiri tidak peduli seberapa sering Anda mengulangi setiap karakter -translate(., 'EE', 'ee')
benar-benar setaratranslate(., 'E', 'e')
. PS: Jangan lupa untuk memberikan suara positif kepada @KirPolishchuk, idenya adalah miliknya.Lebih indah:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
sumber
TEST
ketest
dan cutiTest
seperti itu?translate(., 'TES', 'tes')
. Dengan begitu orang akan menyadari bahwa ini bukanlah terjemahan kata, melainkan terjemahan surat.Solusi XPath 2.0
Gunakan huruf kecil () :
/html/body//text()[contains(lower-case(.),'test')]
Gunakan pencocokan ekspresi reguler kecocokan () dengan panji tidak peka huruf besar / kecil:
/html/body//text()[matches(.,'test', 'i')]
sumber
Iya. Anda dapat menggunakan
translate
untuk mengonversi teks yang ingin Anda cocokkan menjadi huruf kecil sebagai berikut:/html/body//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'test')]
sumber
Jika Anda menggunakan XPath 2.0 maka Anda dapat menentukan pemeriksaan sebagai argumen ketiga untuk mengandung (). Namun, URI pemeriksaan tidak distandarisasi sehingga detailnya bergantung pada produk yang Anda gunakan.
Perhatikan bahwa solusi yang diberikan sebelumnya menggunakan translate () semua mengasumsikan bahwa Anda hanya menggunakan alfabet bahasa Inggris 26 huruf.
UPDATE: XPath 3.1 mendefinisikan URI pemeriksaan standar untuk pencocokan buta huruf.
sumber
Cara saya selalu melakukan ini adalah dengan menggunakan fungsi "terjemahkan" di XPath. Saya tidak akan mengatakan itu sangat cantik tetapi berfungsi dengan benar.
/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]
semoga ini membantu,
sumber