Dokumen XML:
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
Ekspresi XPath:
//*[contains(text(), 'ABC')]
//*cocok dengan elemen turunan dari node root . Artinya, elemen apa pun kecuali simpul root.
[...]adalah predikat , itu menyaring node-set. Ini mengembalikan node yang ...adalah true:
Predikat menyaring simpul-set [...] untuk menghasilkan simpul-set baru. Untuk setiap node di set simpul yang akan difilter, PredicateExpr dievaluasi [...]; jika PredicateExpr mengevaluasi ke true untuk simpul itu, simpul tersebut termasuk dalam simpul-set yang baru; jika tidak, itu tidak termasuk.
contains('haystack', 'needle')kembali truejika haystack berisi needle :
Fungsi: mengandung boolean (string, string)
Fungsi berisi mengembalikan true jika string argumen pertama berisi string argumen kedua, dan sebaliknya mengembalikan false.
Tetapi contains()mengambil string sebagai parameter pertama. Dan melewati node. Untuk mengatasinya, setiap node atau node-set dilewatkan sebagai parameter pertama dikonversi ke string oleh string()fungsi:
Argumen dikonversi untuk mengetikkan string seolah-olah dengan memanggil fungsi string.
string()pengembalian fungsi string-valuedari simpul pertama :
Node-set dikonversi ke string dengan mengembalikan nilai-string dari node dalam node-set yang pertama kali dalam urutan dokumen. Jika simpul-set kosong, string kosong dikembalikan.
string-valuedari simpul elemen :
Nilai string dari suatu simpul elemen adalah gabungan dari nilai-nilai string dari semua turunan simpul teks dari simpul elemen dalam urutan dokumen.
string-valuedari simpul teks :
Nilai string dari simpul teks adalah data karakter.
Jadi, pada dasarnya string-valueadalah semua teks yang terkandung dalam sebuah simpul (gabungan dari semua simpul teks turunan).
text() adalah tes simpul yang cocok dengan simpul teks apa pun:
Teks tes simpul () benar untuk setiap simpul teks. Misalnya, child :: text () akan memilih simpul teks anak-anak dari simpul konteks.
Karena itu, //*[contains(text(), 'ABC')]cocok dengan elemen apa pun (kecuali simpul root), simpul teks pertama yang berisi ABC. Sejak text()mengembalikan set-simpul yang berisi semua simpul teks turunan dari simpul konteks (relatif terhadap ekspresi yang dievaluasi). Tetapi contains()hanya mengambil yang pertama. Jadi untuk dokumen di atas jalan cocok dengan Streetelemen.
Ekspresi berikut //*[text()[contains(., 'ABC')]]cocok dengan elemen apa pun (tetapi simpul root), yang memiliki setidaknya satu simpul teks anak, yang berisi ABC. .mewakili node konteks. Dalam hal ini, ini adalah simpul teks anak dari elemen apa pun kecuali simpul akar. Jadi untuk dokumen di atas jalan cocok dengan Street, dan Commentelemen.
Nah, //*[contains(., 'ABC')]cocok dengan elemen apa pun (kecuali simpul root) yang berisi ABC(dalam rangkaian simpul teks turunan). Untuk dokumen di atas cocok dengan Home, yang Addr, yang Street, dan Commentunsur-unsur. Dengan demikian, //*[contains(., 'BLAH ABC')]cocok Homedengan Addr,, dan Commentelemen.
//*[contains(text(),'ABC')]hanya mengembalikan<Street>elemen. Itu tidak mengembalikan leluhur<Street>atau<Comment>.