XPath выражения — это способ записи указания на место в дереве документа, т.е. указание на конкретные узлы.
Рассмотрим один пример:
Здесь Root — это весь документ (не путать с корневым тегом). У него элемент catalog. У catalog есть дочерние элементы. У product также видим 2 дочерних элемента плюс пространство имен, которое автоматически наследовалось от корня.
На деле в такой схеме может быть несколько тысяч элементов. А XPath служит для навигации по такому дереву.
Оси выборки
Большинство XPath выражений мы пишем от корня, но это не факт. Когда процессор работает, он держит у себя некий узел. Этот узел и является текущим узлом обработки. И мы можем писать относительные пути относительно этого текущего контекста. Для этого нужно двигаться наверх, вниз, направо, налево. И все это в XPath называется оси выборки.
Пример осей выборки:
Здесь мы видим 12 осей выборки:
- self — текущий выбранный узел, это я сам, от меня.
- child — дочерние узлы.
- parent — родитель.
- attribute — атрибут дочерний.
- descendent — все узлы, которые по DOM структуре ниже меня.
- descendent-or-self — текущий узел плюс все его нисходящие узлы.
- ancestor — все восходящие узлы, т.е. которые выше текущего узла.
- ancestor-or-self — все восходящие узлы плюс текущий узел.
- following — все следующие за мной узлы на обработку.
- following-sibling — следующие узлы за мной на одном уровне DOM модели.
- preceding — все предшествующие узлы передо мной (текущим выбранным узлом).
- preceding-sibling — предшествующие узлы на одном уровне с текущим узлом.
Оси записываются так:
child::price
self::node()
parent::node()
ancestor-or-self::node()
<!-- функции выборки -->
axis::node-type-function <!-- выборка по типу узла -->
text() <!-- возьми все текстовые узлы -->
node() <!-- все дочерние узлы -->
comment() <!-- все комментарии -->
processing-instruction() <!-- все процессинговые инструкции -->
Предикаты
Предикаты — это фильтры. После названия узла в квадратных скобках можно указать условие фильтрации. Попадают те узлы, которые соответствуют условию фильтрации. Примеры:
<!-- синтаксис -->
axis::node-test[predicate]
<!-- примеры -->
product[last] <!-- положение узла - последний -->
product[@code="123"] <!-- узел, содержащий название 123 -->
product[@code] <!-- есть атрибут -->
position()-1 <!-- предпоследний узел -->
product[3][@discount] <!-- несколько фильтров -->
Типы данных и функции XPath
Булевские функции:
- boolean (object) — преобразует к логике, все, что хотите.
- not (boolean) — инвертирует логическое значение.
- true ().
- false ().
Числовые функции:
- number — преобразование к числу.
- sum — сумма.
- floor — округление до нижнего целого.
- celling — округление до верхнего целого.
- round — правильное, школьное округление.
Строковые функции (основные):
- comcat — конкатенация (склеивание строк)
- starts-with — начало с.
- contains — содержит.
- subsctring-before — вырезать строку до указанного.
- substring-after — вырезать строку после указанного.
- substring (string, number, number*) — вырезать из строки нужное число символов с нужной позиции.
- string-length — длина строки.
- normalize-space — убрать пробелы в начале и в конце строки.
- translate — заменить символ.
Функции множеств узлов:
- last () — последний узел.
- position () — номер узла.
- count — число узлов.
- local-name — локальное имя без простраства имен.
- namespace-uri — пространство имен для выбранного узла.
- name — возвращает имя узла.
Более подробно о функциях XPath читайте на сайте — w3schools.com.