Документ XML:
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
Вираз XPath:
//*[contains(text(), 'ABC')]
//*
відповідає будь-якому нащадок елемента з кореневого вузла . Тобто будь-який елемент, крім кореневого вузла.
[...]
- це предикат , він фільтрує набір вузлів. Він повертає вузли, для яких ...
це true
:
Присудок фільтрує набір вузлів [...], щоб створити новий набір вузлів. Для кожного вузла в наборі вузлів, який буде фільтруватися, оцінюється PredicateExpr [...]; якщо PredicateExpr оцінює значення true для цього вузла, вузол включається в новий набір вузлів; в іншому випадку він не включається.
contains('haystack', 'needle')
повертає, true
якщо haystack
містить needle
:
Функція: булева містить (рядок, рядок)
Функція містить повертає істину, якщо перша рядок аргументу містить другу рядок аргументу, а в іншому випадку повертає значення false.
Але contains()
приймає рядок як свій перший параметр. І це передані вузли. Щоб вирішити це, кожен вузол або набір вузлів, переданий як перший параметр, перетворюється на рядок string()
функцією:
Аргумент перетворюється на рядок типу так, ніби викликує функцію string.
string()
функція повертає string-value
з першого вузла :
Набір вузлів перетворюється на рядок, повертаючи значення рядка вузла в наборі вузлів, який є першим у порядку документа. Якщо набір вузлів порожній, повертається порожня рядок.
string-value
з вузла елемента :
Значення рядка елемента елемента - це конкатенація рядкових значень усіх текстових вузлів нащадків вузла елемента в порядку документа.
string-value
з текстового вузла :
Рядок-значення текстового вузла - це символьні дані.
Отже, в основному string-value
це весь текст, який міститься у вузлі (об'єднання всіх текстових вузлів нащадків).
text()
це тест вузла, який відповідає будь-якому текстовому вузлу:
Тестовий текст вузла () справедливий для будь-якого текстового вузла. Наприклад, дочір :: text () вибере текстовий вузол дітей контекстного вузла.
Маючи це, //*[contains(text(), 'ABC')]
відповідає будь-якому елементу (крім кореневого вузла), перший текстовий вузол якого містить ABC
. Оскільки text()
повертає набір вузлів, який містить усі дочірні текстові вузли контекстного вузла (стосовно якого оцінюється вираз). Але contains()
бере лише перший. Отже, для документа вище шлях відповідає Street
елементу.
Наступний вираз //*[text()[contains(., 'ABC')]]
відповідає будь-якому елементу (але кореневому вузлу), який містить щонайменше один дочірній текстовий вузол, який містить ABC
. .
представляє контекстний вузол. У цьому випадку це дочірній текстовий вузол будь-якого елемента, крім кореневого вузла. Таким чином , для документа вище шляху збігається з Street
, а Comment
елементи.
Тепер //*[contains(., 'ABC')]
узгоджується з будь-яким елементом (крім кореневого вузла), який містить ABC
(у конкатенації текстових вузлів нащадків). Для документа вище , що він відповідає Home
, з Addr
, в Street
, і Comment
елементи. По суті, //*[contains(., 'BLAH ABC')]
відповідає Home
, то Addr
і Comment
елементи.
//*[contains(text(),'ABC')]
повертає лише<Street>
елемент. Це не повертає жодних предків<Street>
або<Comment>
.