Документ 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>.