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 true
jika 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-value
dari 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-value
dari 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-value
dari simpul teks :
Nilai string dari simpul teks adalah data karakter.
Jadi, pada dasarnya string-value
adalah 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 Street
elemen.
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 Comment
elemen.
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 Comment
unsur-unsur. Dengan demikian, //*[contains(., 'BLAH ABC')]
cocok Home
dengan Addr
,, dan Comment
elemen.
//*[contains(text(),'ABC')]
hanya mengembalikan<Street>
elemen. Itu tidak mengembalikan leluhur<Street>
atau<Comment>
.