Примеры XPath. Книга xpath


синтаксис XPath

XPath использует выражения пути для выбора узлов в документе XML или набор узлов. По узлу вдоль пути (путь) или стадии (шагов) к выбранному.

экземпляра XML-документы

Мы будем использовать этот XML-документ в приведенных ниже примерах.

<bookstore>

<book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book>

<book> <title lang="eng">Learning XML</title> <price>39.95</price> </book>

</bookstore>

Выберите узел

XPath использует выражения пути для выбора узлов в документе XML. Или по пути через узел для выбора шага. Ниже перечислены наиболее полезные выражения пути:

выражение описание
имя_узла Выберите все дочерние узлы данного узла.
/ Выберите из корневого узла.
// Выберите документ из узла согласования выбранного узла, независимо от их местоположения.
, Выберите текущий узел.
.. Выберите родительский элемент текущего узла.
@ Выберите Свойства.

В приведенной ниже таблице мы приводим некоторые из путей выражения и результат выражения:

выражение Путь результат
книжный магазин Выберите все дочерние узлы книжного элемента.
/ Книжный магазин

Выберите корневой элемент книжный магазин.

Примечание: Если путь начинается с косой черты (/), путь всегда представитель абсолютного пути к элементу!

книжный магазин / книга Выберите вложенные элементы, принадлежащие в книжном магазине все книжные элементы.
// Книга Выделить все книги подэлементы, независимо от их положения в документе.
книжный магазин // книга Выбирает все книжные элементы, которые не принадлежат к потомкам книжного магазина элемента, независимо от того, в каком положении они находятся в и под книжный магазин.
// @ Lang Выберите все свойства названных Ланг.

Предикат (Предикаты)

Предикат используется, чтобы найти конкретный узел или узел, который содержит значение, указанное.

Предикат вкладывается в квадратные скобки.

В приведенной ниже таблице, мы перечислили некоторые выражения пути с предикатами и результат выражения:

выражение Путь результат
/ Книжный магазин / книга [1] Выберите вложенные элементы, принадлежащие первой книги книжный элемент.
/ Книжный магазин / книга [последняя ()] Выберите вложенные элементы, принадлежащие книжный последний книжный элемент.
/ Книжный магазин / книга [последняя () - 1] Выберите вложенные элементы, относящиеся к взаимным книжного магазина второго книжного элемента.
/ Книжный магазин / книга [положение () <3] Выберите первые две книги элементы книжного элемента, принадлежащего к подэлементов.
// Название [@lang] Выбрать все атрибут с именем Ланг имеет заголовок элемента.
// Заголовок [@ LANG = 'анг'] Выделите все названия элементов, и эти элементы имеют значение атрибута англ яз.
/bookstore/book[price>35.00] Выделить все книжные элементы книжного элемента, а значение ценового элемента, который должен быть больше, чем 35.00.
/bookstore/book[price>35.00]/title Выберите все элементы заголовка книги элементов книжного элемента, и в котором значение ценового элемента должно быть больше, чем 35.00.

Выберите неизвестные узлы

XPath групповые символы могут быть использованы для выбора неизвестных элементов XML.

Wildcard описание
* Соответствует любому элементу узла.
@ * Соответствует любому узлу атрибута.
узел () Соответствует любой тип узла.

В приведенной ниже таблице, мы перечислили некоторые выражения пути, а также результаты этих выражений:

выражение Путь результат
/ Книжный магазин / * Выберите книжный элемент всех дочерних элементов.
// * Выделить все элементы в документе.
// Заголовок [@ *] Выделить все элементы с атрибутом заголовка.

Выберите несколько путей

Используя выражение пути "|" оператора, вы можете выбрать несколько путей.

В приведенной ниже таблице, мы перечислили некоторые выражения пути, а также результаты этих выражений:

выражение Путь результат
// Книга / название | // Книга / цена Выберите название книги и элементы цен всех элементов.
// Заголовок | // цена Выделить все правоустанавливающие документы и ценовых элементов.
/ Книжный магазин / книга / название | // цена Выберите элементы книги книжный элемент, принадлежащие ко всем титульных элементов и документировать все ценовые элементы.

www.w3big.com

XPath - это... Что такое XPath?

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML. В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка XQuery 1.0. В декабре 2009 года началась разработка версии 2.1, которая использует XQuery 1.1.

На данный момент, самой популярной версией является XPath 1.0. Это связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек. В частности, речь идёт о LibXML, от которой зависит поддержка языка в браузерах с одной стороны и поддержка со стороны серверного интерпретатора с другой.

Основы

XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version="1.0"?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.

Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам.

Например, рассмотрим XHTML документ:

<html> <body> <div>Первый слой <span>блок текста в первом слое</span> </div> <div>Второй слой</div> <div>Третий слой <span>первый блок в третьем слое</span> <span>второй блок в третьем слое</span> <span>третий блок в третьем слое</span> </div> <img /> </body> </html>

XPath-путь /html/body/*/span[@class] (полный синтаксис имеет вид /child::html/child::body/child::*/child::span[attribute::class]) будет соответствовать в нём двум элементам исходного документа — <span>первый блок в третьем слое</span> и <span>второй блок в третьем слое</span>.

Путь делится на шаги адресации, которые разделяются символом «косая черта» / . Каждый шаг адресации состоит из трех частей:

  • ось (в данном примере child::), это обязательная часть;
  • условие проверки узлов (в данном примере это имена элементов документа html, body, span, а символ * означает элемент с любым именем), также обязательная часть;
  • предикат (в данном примере attribute::class), необязательная часть, заключаемая в квадратные скобки, в которой могут содержаться оси, условия проверки, функции, операторы (+, -, <, > и пр.).

Анализ ведется слева направо. Если первый символ это / , то путь адресации считается абсолютным (то есть от корня документа). При этом за узел контекста на первом шаге берется корневой элемент (html). Контекст — это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации мы получаем новый набор узлов документа, и этот набор становится контекстом для следующего шага адресации.

На втором шаге адресации (child::body) контекстом становится html элемент. Ось child:: говорит о том, что необходимо найти все непосредственные потомки элемента html, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить все узлы с именем body. В ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится элементом контекста для третьего шага.

Третий шаг адресации: child::* . Ось child:: собирает все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый набор нужно включить элементы основного типа с любым именем. В ходе этого шага получаем набор узлов, состоящий из трех элементов div и одного элемента img.

Четвёртый шаг адресации: child::span . Теперь контекстом является набор из четырёх элементов. И следующий набор узлов создается в четыре прохода (за четыре итерации). При первой итерации узлом контекста становится первый div. Согласно заданной оси child:: и правилу проверки span, в набор включаются непосредственные потомки div-а, имя которых равно span. При второй итерации в набор ничего добавлено не будет, так как у второго div нет потомков. Третья итерация добавит в набор сразу три элемента span, а четвёртая ничего не добавит, так как у элемента img нет потомков. Итак, в ходе проверки получен набор узлов, состоящий из четырёх элементов span. Это и будет контекстом для последующей обработки.

Следующего шага нет, поэтому будет производиться фильтрация отобранного набора. В этом и состоит отличие предикатов от шагов адресации. На каждом шаге адресации получаем новый набор, отталкиваясь от контекста, полученного на предыдущем шаге. В ходе же обработки предиката новый набор получается из текущего методом фильтрации, когда из набора исключаются узлы, не прошедшие условие проверки. В данном случае ось attribute:: говорит о необходимости проверить, если ли у узлов контекста атрибуты, а условие class требует оставить лишь те узлы, у которых задан атрибут с именем class. Фильтрация происходит за четыре итерации, но в окончательный набор попадают только два элемента span.

Оси

Оси — это база языка XPath.

  • ancestor:: — Возвращает множество предков.
  • ancestor-or-self:: — Возвращает множество предков и текущий элемент.
  • attribute:: — Возвращает множество атрибутов текущего элемента.
  • child:: — Возвращает множество потомков на один уровень ниже.
  • descendant:: — Возвращает полное множество потомков.
  • descendant-or-self:: — Возвращает полное множество потомков и текущий элемент.
  • following:: — Возвращает необработанное множество, ниже текущего элемента.
  • following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
  • namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
  • parent:: — Возвращает предка на один уровень назад.
  • preceding:: — Возвращает множество обработанных элементов исключая множество предков.
  • preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
  • self:: — Возвращает текущий элемент.

Существуют сокращения для некоторых осей, например:

  • attribute:: — можно заменить на «@»
  • child:: — часто просто опускают
  • descendant:: — можно заменить на «.//»
  • parent:: — можно заменить на «..»
  • self:: — можно заменить на «.»

Дополнением к базе является набор функций, которые делятся на 5 групп:

Системные функции

node-set document(object, node-set?) Возвращает документ, указанный в параметре object. string format-number(number, string, string?) Форматирует число согласно образцу, указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён. string generate-id(node-set?) Возвращает строку, являющуюся уникальным идентификатором. node-set key(string, object) Возвращает множество с указанным ключом (аналогично функции id для идентификаторов). string unparsed-entity-uri(string) Возвращает непроанализированный URI, если такового нет, возвращает пустую строку. boolean element-available(string) Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath. boolean function-available(string) Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath. object system-property(string) Параметры, возвращающие системные переменные, могут быть: * xsl: version — возвращает версию XSLT процессора. * xsl: vendor — возвращает производителя XSLT процессора. * xsl: vendor-url — возвращает URL, идентифицирующий производителя. Если используется неизвестный параметр, функция возвращает пустую строку. boolean lang(string) Возвращает истину, если у текущего тега имеется атрибут xml: lang, либо родитель тега имеет атрибут xml: lang и в нем указан совпадающий строке символ.

Функции с множествами

  • * — обозначает любое имя или набор символов, @* — любой атрибут
  • $name — обращение к переменной, где name — имя переменной или параметра.
  • [] — дополнительные условия выборки
  • {} — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
  • / — определяет уровень дерева
node-set node() Возвращает все узлы. Для этой функции часто используют заменитель '*', но в отличие от звездочки — node() возвращает и текстовые узлы. string text() Возвращает набор текстовых узлов; node-set current() Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция. number position() Возвращает позицию элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number last() Возвращает номер последнего элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number count(node-set) Возвращает количество элементов в node-set. string name(node-set?) Возвращает полное имя первого тега в множестве. string namespace-uri(node-set?) Возвращает ссылку на url определяющий пространство имён. string local-name(node-set?) Возвращает имя первого тега в множестве, без пространства имён. node-set id(object) Находит элемент с уникальным идентификатором

Строковые функции

string string(object?) Возвращает текстовое содержимое элемента. По сути возвращает объединенное множество текстовых элементов на один уровень ниже. string concat(string, string, string*) Объединяет две или более строк number string-length(string?) Возвращает длину строки. boolean contains(string, string) Возвращает истину, если первая строка содержит вторую, иначе возвращает ложь. string substring(string, number, number?) Возвращает строку вырезанную из строки начиная с указанного номера, и если указан второй номер — количество символов. string substring-before(string, string) Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки. string substring-after(string, string) Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки. boolean starts-with(string, string) Возвращает истину если вторая строка входит в начало первой, иначе возвращает ложь. boolean ends-with(string, string) Возвращает истину если вторая строка входит в конец первой, иначе возвращает ложь. string normalize-space(string?) Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами. string translate(string, string, string) Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. translate(«bar», «abc», «ABC») вернет BAr.

Логические функции

  • or — логическое «или»
  • and — логическое «и»
  • = — логическое «равно»
  • < (&lt;) — логическое «меньше»
  • > (&gt;) — логическое «больше»
  • <= (&lt;=) — логическое «меньше либо равно»
  • >= (&gt;=) — логическое «больше либо равно»
boolean boolean(object) Приводит объект к логическому типу; boolean true() Возвращает истину. boolean false() Возвращает ложь. boolean not(boolean) Отрицание, возвращает истину если аргумент ложь и наоборот.

Числовые функции

  • + — сложение
  • − — вычитание
  • * — умножение
  • div — обычное деление (не деление нацело!)
  • mod — остаток от деления
number number(object?) Переводит объект в число. number sum(node-set) Вернёт сумму множества, каждый тег множества будет преобразован в строку и из него получено число. number floor(number) Возвращает наибольшее целое число, не большее, чем аргумент. number ceiling(number) Возвращает наименьшее целое число, не меньшее, чем аргумент. number round(number) Округляет число по математическим правилам.

Ссылки

dikc.academic.ru

Примеры XPath

Выражение

Ссылается на

book[last()]

Последний элемент <book> в контексте текущего узла.

book/author[last()]

Последний дочерний элемент <author> каждого элемента <book> в контексте текущего узла.

(book/author)[last()]

Последний элемент <author> из всего набора элементов <author>, дочерних по отношению к элементам <book> в контексте текущего узла.

book[excerpt]

Все элементы <book>, которые содержат хотя бы один дочерний элемент <excerpt>.

book[excerpt]/title

Все элементы <title>, дочерние по отношению к элементам <book> и содержащие хотя бы один дочерний элемент <excerpt>.

book[excerpt]/author[degree]

Все элементы <author>, содержащие по крайней мере один дочерний элемент <degree> и являющиеся дочерними для элементов <book>, содержащих по крайней мере один элемент <excerpt>.

book[author/degree]

Все элементы <book>, у которых есть дочерние элементы <author>, у которых, в свою очередь, есть хотя бы один дочерний элемент <degree>.

author[degree][award]

Все элементы <author>, которые содержат хотя бы один элемент <degree> и хотя бы один элемент <award>.

author[degree and award]

Все элементы <author>, которые содержат хотя бы один элемент <degree> и хотя бы один элемент <award>.

author[(degree or award) and publication]

Все элементы <author>, которые содержат хотя бы один дочерний элемент <degree> или <award> и хотя бы один дочерний элемент <publication>.

author[degree and not(publication)]

Все элементы <author>, содержащие по крайней мере один дочерний элемент <degree> и не содержащие дочерних элементов <publication>.

author[not(degree or award) and publication]

Все элементы <author>, содержащие по крайней мере один дочерний элемент <publication> и не содержащие ни элементов <degree>, ни элементов <award>.

author[last-name = "Bob"]

Все элементы <author>, которые содержат хотя бы один дочерний элемент <last-name> со значением Bob.

author[last-name[1] = "Bob"]

Все элементы <author>, первый дочерний элемент <last-name> которых имеет значение Bob. Заметьте, что это эквивалентно выражению в следующей строке.

author[last-name [position()=1]= "Bob"]

Все элементы <author>, первый дочерний элемент <last-name> которых имеет значение Bob.

degree[@from != "Harvard"]

Все элементы <degree>, у которых атрибут from не равен "Harvard".

author[. = "Matthew Bob"]

Все элементы <author> со значением Matthew Bob.

author[last-name = "Bob" and ../price &gt; 50]

Все элементы <author>, имеющие дочерний элемент <last-name> со значением Bob и одноуровневый элемент <price> со значением выше 50.

book[position() &lt;= 3]

Первые три книги (1, 2, 3).

author[not(last-name = "Bob")]

Все элементы <author>, не содержащие дочерних элементов <last-name> со значением Bob.

author[first-name = "Bob"]

Все элементы <author>, которые содержат хотя бы один дочерний элемент <first-name> со значением Bob.

author[* = "Bob"]

все элементы author, имеющие какой-либо дочерний элемент со значением Bob.

author[last-name = "Bob" and first-name = "Joe"]

Все элементы <author>, имеющие дочерний элемент <last-name> со значением Bob и дочерний элемент <first-name> со значением Joe.

price[@intl = "Canada"]

Все элементы <price> в контекстном узле, имеющие атрибут intl со значением "Canada".

degree[position() &lt; 3]

Первые два элемента <degree>, являющиеся дочерними для контекстного узла.

p/text()[2]

Второй текстовый узел в каждом элементе <p> контекстного узла.

ancestor::book[1]

Ближайший элемент <book>, который является предком узла контекста.

ancestor::book[author][1]

Ближайший элемент <book>, который является предком узла контекста и содержит дочерний элемент <author>.

ancestor::author[parent::book][1]

Ближайший элемент <author>, который является предком в текущем контексте и является дочерним элементом для элемента <book>.

msdn.microsoft.com

XPath - это... Что такое XPath?

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML. В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка XQuery 1.0. В декабре 2009 года началась разработка версии 2.1, которая использует XQuery 1.1.

На данный момент, самой популярной версией является XPath 1.0. Это связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек. В частности, речь идёт о LibXML, от которой зависит поддержка языка в браузерах с одной стороны и поддержка со стороны серверного интерпретатора с другой.

Основы

XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version="1.0"?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.

Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам.

Например, рассмотрим XHTML документ:

<html> <body> <div>Первый слой <span>блок текста в первом слое</span> </div> <div>Второй слой</div> <div>Третий слой <span>первый блок в третьем слое</span> <span>второй блок в третьем слое</span> <span>третий блок в третьем слое</span> </div> <img /> </body> </html>

XPath-путь /html/body/*/span[@class] (полный синтаксис имеет вид /child::html/child::body/child::*/child::span[attribute::class]) будет соответствовать в нём двум элементам исходного документа — <span>первый блок в третьем слое</span> и <span>второй блок в третьем слое</span>.

Путь делится на шаги адресации, которые разделяются символом «косая черта» / . Каждый шаг адресации состоит из трех частей:

  • ось (в данном примере child::), это обязательная часть;
  • условие проверки узлов (в данном примере это имена элементов документа html, body, span, а символ * означает элемент с любым именем), также обязательная часть;
  • предикат (в данном примере attribute::class), необязательная часть, заключаемая в квадратные скобки, в которой могут содержаться оси, условия проверки, функции, операторы (+, -, <, > и пр.).

Анализ ведется слева направо. Если первый символ это / , то путь адресации считается абсолютным (то есть от корня документа). При этом за узел контекста на первом шаге берется корневой элемент (html). Контекст — это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации мы получаем новый набор узлов документа, и этот набор становится контекстом для следующего шага адресации.

На втором шаге адресации (child::body) контекстом становится html элемент. Ось child:: говорит о том, что необходимо найти все непосредственные потомки элемента html, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить все узлы с именем body. В ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится элементом контекста для третьего шага.

Третий шаг адресации: child::* . Ось child:: собирает все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый набор нужно включить элементы основного типа с любым именем. В ходе этого шага получаем набор узлов, состоящий из трех элементов div и одного элемента img.

Четвёртый шаг адресации: child::span . Теперь контекстом является набор из четырёх элементов. И следующий набор узлов создается в четыре прохода (за четыре итерации). При первой итерации узлом контекста становится первый div. Согласно заданной оси child:: и правилу проверки span, в набор включаются непосредственные потомки div-а, имя которых равно span. При второй итерации в набор ничего добавлено не будет, так как у второго div нет потомков. Третья итерация добавит в набор сразу три элемента span, а четвёртая ничего не добавит, так как у элемента img нет потомков. Итак, в ходе проверки получен набор узлов, состоящий из четырёх элементов span. Это и будет контекстом для последующей обработки.

Следующего шага нет, поэтому будет производиться фильтрация отобранного набора. В этом и состоит отличие предикатов от шагов адресации. На каждом шаге адресации получаем новый набор, отталкиваясь от контекста, полученного на предыдущем шаге. В ходе же обработки предиката новый набор получается из текущего методом фильтрации, когда из набора исключаются узлы, не прошедшие условие проверки. В данном случае ось attribute:: говорит о необходимости проверить, если ли у узлов контекста атрибуты, а условие class требует оставить лишь те узлы, у которых задан атрибут с именем class. Фильтрация происходит за четыре итерации, но в окончательный набор попадают только два элемента span.

Оси

Оси — это база языка XPath.

  • ancestor:: — Возвращает множество предков.
  • ancestor-or-self:: — Возвращает множество предков и текущий элемент.
  • attribute:: — Возвращает множество атрибутов текущего элемента.
  • child:: — Возвращает множество потомков на один уровень ниже.
  • descendant:: — Возвращает полное множество потомков.
  • descendant-or-self:: — Возвращает полное множество потомков и текущий элемент.
  • following:: — Возвращает необработанное множество, ниже текущего элемента.
  • following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
  • namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
  • parent:: — Возвращает предка на один уровень назад.
  • preceding:: — Возвращает множество обработанных элементов исключая множество предков.
  • preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
  • self:: — Возвращает текущий элемент.

Существуют сокращения для некоторых осей, например:

  • attribute:: — можно заменить на «@»
  • child:: — часто просто опускают
  • descendant:: — можно заменить на «.//»
  • parent:: — можно заменить на «..»
  • self:: — можно заменить на «.»

Дополнением к базе является набор функций, которые делятся на 5 групп:

Системные функции

node-set document(object, node-set?) Возвращает документ, указанный в параметре object. string format-number(number, string, string?) Форматирует число согласно образцу, указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён. string generate-id(node-set?) Возвращает строку, являющуюся уникальным идентификатором. node-set key(string, object) Возвращает множество с указанным ключом (аналогично функции id для идентификаторов). string unparsed-entity-uri(string) Возвращает непроанализированный URI, если такового нет, возвращает пустую строку. boolean element-available(string) Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath. boolean function-available(string) Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath. object system-property(string) Параметры, возвращающие системные переменные, могут быть: * xsl: version — возвращает версию XSLT процессора. * xsl: vendor — возвращает производителя XSLT процессора. * xsl: vendor-url — возвращает URL, идентифицирующий производителя. Если используется неизвестный параметр, функция возвращает пустую строку. boolean lang(string) Возвращает истину, если у текущего тега имеется атрибут xml: lang, либо родитель тега имеет атрибут xml: lang и в нем указан совпадающий строке символ.

Функции с множествами

  • * — обозначает любое имя или набор символов, @* — любой атрибут
  • $name — обращение к переменной, где name — имя переменной или параметра.
  • [] — дополнительные условия выборки
  • {} — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
  • / — определяет уровень дерева
node-set node() Возвращает все узлы. Для этой функции часто используют заменитель '*', но в отличие от звездочки — node() возвращает и текстовые узлы. string text() Возвращает набор текстовых узлов; node-set current() Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция. number position() Возвращает позицию элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number last() Возвращает номер последнего элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number count(node-set) Возвращает количество элементов в node-set. string name(node-set?) Возвращает полное имя первого тега в множестве. string namespace-uri(node-set?) Возвращает ссылку на url определяющий пространство имён. string local-name(node-set?) Возвращает имя первого тега в множестве, без пространства имён. node-set id(object) Находит элемент с уникальным идентификатором

Строковые функции

string string(object?) Возвращает текстовое содержимое элемента. По сути возвращает объединенное множество текстовых элементов на один уровень ниже. string concat(string, string, string*) Объединяет две или более строк number string-length(string?) Возвращает длину строки. boolean contains(string, string) Возвращает истину, если первая строка содержит вторую, иначе возвращает ложь. string substring(string, number, number?) Возвращает строку вырезанную из строки начиная с указанного номера, и если указан второй номер — количество символов. string substring-before(string, string) Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки. string substring-after(string, string) Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки. boolean starts-with(string, string) Возвращает истину если вторая строка входит в начало первой, иначе возвращает ложь. boolean ends-with(string, string) Возвращает истину если вторая строка входит в конец первой, иначе возвращает ложь. string normalize-space(string?) Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами. string translate(string, string, string) Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. translate(«bar», «abc», «ABC») вернет BAr.

Логические функции

  • or — логическое «или»
  • and — логическое «и»
  • = — логическое «равно»
  • < (&lt;) — логическое «меньше»
  • > (&gt;) — логическое «больше»
  • <= (&lt;=) — логическое «меньше либо равно»
  • >= (&gt;=) — логическое «больше либо равно»
boolean boolean(object) Приводит объект к логическому типу; boolean true() Возвращает истину. boolean false() Возвращает ложь. boolean not(boolean) Отрицание, возвращает истину если аргумент ложь и наоборот.

Числовые функции

  • + — сложение
  • − — вычитание
  • * — умножение
  • div — обычное деление (не деление нацело!)
  • mod — остаток от деления
number number(object?) Переводит объект в число. number sum(node-set) Вернёт сумму множества, каждый тег множества будет преобразован в строку и из него получено число. number floor(number) Возвращает наибольшее целое число, не большее, чем аргумент. number ceiling(number) Возвращает наименьшее целое число, не меньшее, чем аргумент. number round(number) Округляет число по математическим правилам.

Ссылки

biograf.academic.ru

XPath - это... Что такое XPath?

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML. В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка XQuery 1.0. В декабре 2009 года началась разработка версии 2.1, которая использует XQuery 1.1.

На данный момент, самой популярной версией является XPath 1.0. Это связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек. В частности, речь идёт о LibXML, от которой зависит поддержка языка в браузерах с одной стороны и поддержка со стороны серверного интерпретатора с другой.

Основы

XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version="1.0"?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.

Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам.

Например, рассмотрим XHTML документ:

<html> <body> <div>Первый слой <span>блок текста в первом слое</span> </div> <div>Второй слой</div> <div>Третий слой <span>первый блок в третьем слое</span> <span>второй блок в третьем слое</span> <span>третий блок в третьем слое</span> </div> <img /> </body> </html>

XPath-путь /html/body/*/span[@class] (полный синтаксис имеет вид /child::html/child::body/child::*/child::span[attribute::class]) будет соответствовать в нём двум элементам исходного документа — <span>первый блок в третьем слое</span> и <span>второй блок в третьем слое</span>.

Путь делится на шаги адресации, которые разделяются символом «косая черта» / . Каждый шаг адресации состоит из трех частей:

  • ось (в данном примере child::), это обязательная часть;
  • условие проверки узлов (в данном примере это имена элементов документа html, body, span, а символ * означает элемент с любым именем), также обязательная часть;
  • предикат (в данном примере attribute::class), необязательная часть, заключаемая в квадратные скобки, в которой могут содержаться оси, условия проверки, функции, операторы (+, -, <, > и пр.).

Анализ ведется слева направо. Если первый символ это / , то путь адресации считается абсолютным (то есть от корня документа). При этом за узел контекста на первом шаге берется корневой элемент (html). Контекст — это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации мы получаем новый набор узлов документа, и этот набор становится контекстом для следующего шага адресации.

На втором шаге адресации (child::body) контекстом становится html элемент. Ось child:: говорит о том, что необходимо найти все непосредственные потомки элемента html, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить все узлы с именем body. В ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится элементом контекста для третьего шага.

Третий шаг адресации: child::* . Ось child:: собирает все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый набор нужно включить элементы основного типа с любым именем. В ходе этого шага получаем набор узлов, состоящий из трех элементов div и одного элемента img.

Четвёртый шаг адресации: child::span . Теперь контекстом является набор из четырёх элементов. И следующий набор узлов создается в четыре прохода (за четыре итерации). При первой итерации узлом контекста становится первый div. Согласно заданной оси child:: и правилу проверки span, в набор включаются непосредственные потомки div-а, имя которых равно span. При второй итерации в набор ничего добавлено не будет, так как у второго div нет потомков. Третья итерация добавит в набор сразу три элемента span, а четвёртая ничего не добавит, так как у элемента img нет потомков. Итак, в ходе проверки получен набор узлов, состоящий из четырёх элементов span. Это и будет контекстом для последующей обработки.

Следующего шага нет, поэтому будет производиться фильтрация отобранного набора. В этом и состоит отличие предикатов от шагов адресации. На каждом шаге адресации получаем новый набор, отталкиваясь от контекста, полученного на предыдущем шаге. В ходе же обработки предиката новый набор получается из текущего методом фильтрации, когда из набора исключаются узлы, не прошедшие условие проверки. В данном случае ось attribute:: говорит о необходимости проверить, если ли у узлов контекста атрибуты, а условие class требует оставить лишь те узлы, у которых задан атрибут с именем class. Фильтрация происходит за четыре итерации, но в окончательный набор попадают только два элемента span.

Оси

Оси — это база языка XPath.

  • ancestor:: — Возвращает множество предков.
  • ancestor-or-self:: — Возвращает множество предков и текущий элемент.
  • attribute:: — Возвращает множество атрибутов текущего элемента.
  • child:: — Возвращает множество потомков на один уровень ниже.
  • descendant:: — Возвращает полное множество потомков.
  • descendant-or-self:: — Возвращает полное множество потомков и текущий элемент.
  • following:: — Возвращает необработанное множество, ниже текущего элемента.
  • following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
  • namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
  • parent:: — Возвращает предка на один уровень назад.
  • preceding:: — Возвращает множество обработанных элементов исключая множество предков.
  • preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
  • self:: — Возвращает текущий элемент.

Существуют сокращения для некоторых осей, например:

  • attribute:: — можно заменить на «@»
  • child:: — часто просто опускают
  • descendant:: — можно заменить на «.//»
  • parent:: — можно заменить на «..»
  • self:: — можно заменить на «.»

Дополнением к базе является набор функций, которые делятся на 5 групп:

Системные функции

node-set document(object, node-set?) Возвращает документ, указанный в параметре object. string format-number(number, string, string?) Форматирует число согласно образцу, указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён. string generate-id(node-set?) Возвращает строку, являющуюся уникальным идентификатором. node-set key(string, object) Возвращает множество с указанным ключом (аналогично функции id для идентификаторов). string unparsed-entity-uri(string) Возвращает непроанализированный URI, если такового нет, возвращает пустую строку. boolean element-available(string) Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath. boolean function-available(string) Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath. object system-property(string) Параметры, возвращающие системные переменные, могут быть: * xsl: version — возвращает версию XSLT процессора. * xsl: vendor — возвращает производителя XSLT процессора. * xsl: vendor-url — возвращает URL, идентифицирующий производителя. Если используется неизвестный параметр, функция возвращает пустую строку. boolean lang(string) Возвращает истину, если у текущего тега имеется атрибут xml: lang, либо родитель тега имеет атрибут xml: lang и в нем указан совпадающий строке символ.

Функции с множествами

  • * — обозначает любое имя или набор символов, @* — любой атрибут
  • $name — обращение к переменной, где name — имя переменной или параметра.
  • [] — дополнительные условия выборки
  • {} — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
  • / — определяет уровень дерева
node-set node() Возвращает все узлы. Для этой функции часто используют заменитель '*', но в отличие от звездочки — node() возвращает и текстовые узлы. string text() Возвращает набор текстовых узлов; node-set current() Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция. number position() Возвращает позицию элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number last() Возвращает номер последнего элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number count(node-set) Возвращает количество элементов в node-set. string name(node-set?) Возвращает полное имя первого тега в множестве. string namespace-uri(node-set?) Возвращает ссылку на url определяющий пространство имён. string local-name(node-set?) Возвращает имя первого тега в множестве, без пространства имён. node-set id(object) Находит элемент с уникальным идентификатором

Строковые функции

string string(object?) Возвращает текстовое содержимое элемента. По сути возвращает объединенное множество текстовых элементов на один уровень ниже. string concat(string, string, string*) Объединяет две или более строк number string-length(string?) Возвращает длину строки. boolean contains(string, string) Возвращает истину, если первая строка содержит вторую, иначе возвращает ложь. string substring(string, number, number?) Возвращает строку вырезанную из строки начиная с указанного номера, и если указан второй номер — количество символов. string substring-before(string, string) Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки. string substring-after(string, string) Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки. boolean starts-with(string, string) Возвращает истину если вторая строка входит в начало первой, иначе возвращает ложь. boolean ends-with(string, string) Возвращает истину если вторая строка входит в конец первой, иначе возвращает ложь. string normalize-space(string?) Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами. string translate(string, string, string) Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. translate(«bar», «abc», «ABC») вернет BAr.

Логические функции

  • or — логическое «или»
  • and — логическое «и»
  • = — логическое «равно»
  • < (&lt;) — логическое «меньше»
  • > (&gt;) — логическое «больше»
  • <= (&lt;=) — логическое «меньше либо равно»
  • >= (&gt;=) — логическое «больше либо равно»
boolean boolean(object) Приводит объект к логическому типу; boolean true() Возвращает истину. boolean false() Возвращает ложь. boolean not(boolean) Отрицание, возвращает истину если аргумент ложь и наоборот.

Числовые функции

  • + — сложение
  • − — вычитание
  • * — умножение
  • div — обычное деление (не деление нацело!)
  • mod — остаток от деления
number number(object?) Переводит объект в число. number sum(node-set) Вернёт сумму множества, каждый тег множества будет преобразован в строку и из него получено число. number floor(number) Возвращает наибольшее целое число, не большее, чем аргумент. number ceiling(number) Возвращает наименьшее целое число, не меньшее, чем аргумент. number round(number) Округляет число по математическим правилам.

Ссылки

veter.academic.ru

XPath - это... Что такое XPath?

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML. В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка XQuery 1.0. В декабре 2009 года началась разработка версии 2.1, которая использует XQuery 1.1.

На данный момент, самой популярной версией является XPath 1.0. Это связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек. В частности, речь идёт о LibXML, от которой зависит поддержка языка в браузерах с одной стороны и поддержка со стороны серверного интерпретатора с другой.

Основы

XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version="1.0"?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.

Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам.

Например, рассмотрим XHTML документ:

<html> <body> <div>Первый слой <span>блок текста в первом слое</span> </div> <div>Второй слой</div> <div>Третий слой <span>первый блок в третьем слое</span> <span>второй блок в третьем слое</span> <span>третий блок в третьем слое</span> </div> <img /> </body> </html>

XPath-путь /html/body/*/span[@class] (полный синтаксис имеет вид /child::html/child::body/child::*/child::span[attribute::class]) будет соответствовать в нём двум элементам исходного документа — <span>первый блок в третьем слое</span> и <span>второй блок в третьем слое</span>.

Путь делится на шаги адресации, которые разделяются символом «косая черта» / . Каждый шаг адресации состоит из трех частей:

  • ось (в данном примере child::), это обязательная часть;
  • условие проверки узлов (в данном примере это имена элементов документа html, body, span, а символ * означает элемент с любым именем), также обязательная часть;
  • предикат (в данном примере attribute::class), необязательная часть, заключаемая в квадратные скобки, в которой могут содержаться оси, условия проверки, функции, операторы (+, -, <, > и пр.).

Анализ ведется слева направо. Если первый символ это / , то путь адресации считается абсолютным (то есть от корня документа). При этом за узел контекста на первом шаге берется корневой элемент (html). Контекст — это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации мы получаем новый набор узлов документа, и этот набор становится контекстом для следующего шага адресации.

На втором шаге адресации (child::body) контекстом становится html элемент. Ось child:: говорит о том, что необходимо найти все непосредственные потомки элемента html, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить все узлы с именем body. В ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится элементом контекста для третьего шага.

Третий шаг адресации: child::* . Ось child:: собирает все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый набор нужно включить элементы основного типа с любым именем. В ходе этого шага получаем набор узлов, состоящий из трех элементов div и одного элемента img.

Четвёртый шаг адресации: child::span . Теперь контекстом является набор из четырёх элементов. И следующий набор узлов создается в четыре прохода (за четыре итерации). При первой итерации узлом контекста становится первый div. Согласно заданной оси child:: и правилу проверки span, в набор включаются непосредственные потомки div-а, имя которых равно span. При второй итерации в набор ничего добавлено не будет, так как у второго div нет потомков. Третья итерация добавит в набор сразу три элемента span, а четвёртая ничего не добавит, так как у элемента img нет потомков. Итак, в ходе проверки получен набор узлов, состоящий из четырёх элементов span. Это и будет контекстом для последующей обработки.

Следующего шага нет, поэтому будет производиться фильтрация отобранного набора. В этом и состоит отличие предикатов от шагов адресации. На каждом шаге адресации получаем новый набор, отталкиваясь от контекста, полученного на предыдущем шаге. В ходе же обработки предиката новый набор получается из текущего методом фильтрации, когда из набора исключаются узлы, не прошедшие условие проверки. В данном случае ось attribute:: говорит о необходимости проверить, если ли у узлов контекста атрибуты, а условие class требует оставить лишь те узлы, у которых задан атрибут с именем class. Фильтрация происходит за четыре итерации, но в окончательный набор попадают только два элемента span.

Оси

Оси — это база языка XPath.

  • ancestor:: — Возвращает множество предков.
  • ancestor-or-self:: — Возвращает множество предков и текущий элемент.
  • attribute:: — Возвращает множество атрибутов текущего элемента.
  • child:: — Возвращает множество потомков на один уровень ниже.
  • descendant:: — Возвращает полное множество потомков.
  • descendant-or-self:: — Возвращает полное множество потомков и текущий элемент.
  • following:: — Возвращает необработанное множество, ниже текущего элемента.
  • following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
  • namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
  • parent:: — Возвращает предка на один уровень назад.
  • preceding:: — Возвращает множество обработанных элементов исключая множество предков.
  • preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
  • self:: — Возвращает текущий элемент.

Существуют сокращения для некоторых осей, например:

  • attribute:: — можно заменить на «@»
  • child:: — часто просто опускают
  • descendant:: — можно заменить на «.//»
  • parent:: — можно заменить на «..»
  • self:: — можно заменить на «.»

Дополнением к базе является набор функций, которые делятся на 5 групп:

Системные функции

node-set document(object, node-set?) Возвращает документ, указанный в параметре object. string format-number(number, string, string?) Форматирует число согласно образцу, указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён. string generate-id(node-set?) Возвращает строку, являющуюся уникальным идентификатором. node-set key(string, object) Возвращает множество с указанным ключом (аналогично функции id для идентификаторов). string unparsed-entity-uri(string) Возвращает непроанализированный URI, если такового нет, возвращает пустую строку. boolean element-available(string) Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath. boolean function-available(string) Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath. object system-property(string) Параметры, возвращающие системные переменные, могут быть: * xsl: version — возвращает версию XSLT процессора. * xsl: vendor — возвращает производителя XSLT процессора. * xsl: vendor-url — возвращает URL, идентифицирующий производителя. Если используется неизвестный параметр, функция возвращает пустую строку. boolean lang(string) Возвращает истину, если у текущего тега имеется атрибут xml: lang, либо родитель тега имеет атрибут xml: lang и в нем указан совпадающий строке символ.

Функции с множествами

  • * — обозначает любое имя или набор символов, @* — любой атрибут
  • $name — обращение к переменной, где name — имя переменной или параметра.
  • [] — дополнительные условия выборки
  • {} — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
  • / — определяет уровень дерева
node-set node() Возвращает все узлы. Для этой функции часто используют заменитель '*', но в отличие от звездочки — node() возвращает и текстовые узлы. string text() Возвращает набор текстовых узлов; node-set current() Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция. number position() Возвращает позицию элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number last() Возвращает номер последнего элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number count(node-set) Возвращает количество элементов в node-set. string name(node-set?) Возвращает полное имя первого тега в множестве. string namespace-uri(node-set?) Возвращает ссылку на url определяющий пространство имён. string local-name(node-set?) Возвращает имя первого тега в множестве, без пространства имён. node-set id(object) Находит элемент с уникальным идентификатором

Строковые функции

string string(object?) Возвращает текстовое содержимое элемента. По сути возвращает объединенное множество текстовых элементов на один уровень ниже. string concat(string, string, string*) Объединяет две или более строк number string-length(string?) Возвращает длину строки. boolean contains(string, string) Возвращает истину, если первая строка содержит вторую, иначе возвращает ложь. string substring(string, number, number?) Возвращает строку вырезанную из строки начиная с указанного номера, и если указан второй номер — количество символов. string substring-before(string, string) Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки. string substring-after(string, string) Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки. boolean starts-with(string, string) Возвращает истину если вторая строка входит в начало первой, иначе возвращает ложь. boolean ends-with(string, string) Возвращает истину если вторая строка входит в конец первой, иначе возвращает ложь. string normalize-space(string?) Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами. string translate(string, string, string) Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. translate(«bar», «abc», «ABC») вернет BAr.

Логические функции

  • or — логическое «или»
  • and — логическое «и»
  • = — логическое «равно»
  • < (&lt;) — логическое «меньше»
  • > (&gt;) — логическое «больше»
  • <= (&lt;=) — логическое «меньше либо равно»
  • >= (&gt;=) — логическое «больше либо равно»
boolean boolean(object) Приводит объект к логическому типу; boolean true() Возвращает истину. boolean false() Возвращает ложь. boolean not(boolean) Отрицание, возвращает истину если аргумент ложь и наоборот.

Числовые функции

  • + — сложение
  • − — вычитание
  • * — умножение
  • div — обычное деление (не деление нацело!)
  • mod — остаток от деления
number number(object?) Переводит объект в число. number sum(node-set) Вернёт сумму множества, каждый тег множества будет преобразован в строку и из него получено число. number floor(number) Возвращает наибольшее целое число, не большее, чем аргумент. number ceiling(number) Возвращает наименьшее целое число, не меньшее, чем аргумент. number round(number) Округляет число по математическим правилам.

Ссылки

dik.academic.ru

XPath - это... Что такое XPath?

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML. В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка XQuery 1.0. В декабре 2009 года началась разработка версии 2.1, которая использует XQuery 1.1.

На данный момент, самой популярной версией является XPath 1.0. Это связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек. В частности, речь идёт о LibXML, от которой зависит поддержка языка в браузерах с одной стороны и поддержка со стороны серверного интерпретатора с другой.

Основы

XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version="1.0"?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.

Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам.

Например, рассмотрим XHTML документ:

<html> <body> <div>Первый слой <span>блок текста в первом слое</span> </div> <div>Второй слой</div> <div>Третий слой <span>первый блок в третьем слое</span> <span>второй блок в третьем слое</span> <span>третий блок в третьем слое</span> </div> <img /> </body> </html>

XPath-путь /html/body/*/span[@class] (полный синтаксис имеет вид /child::html/child::body/child::*/child::span[attribute::class]) будет соответствовать в нём двум элементам исходного документа — <span>первый блок в третьем слое</span> и <span>второй блок в третьем слое</span>.

Путь делится на шаги адресации, которые разделяются символом «косая черта» / . Каждый шаг адресации состоит из трех частей:

  • ось (в данном примере child::), это обязательная часть;
  • условие проверки узлов (в данном примере это имена элементов документа html, body, span, а символ * означает элемент с любым именем), также обязательная часть;
  • предикат (в данном примере attribute::class), необязательная часть, заключаемая в квадратные скобки, в которой могут содержаться оси, условия проверки, функции, операторы (+, -, <, > и пр.).

Анализ ведется слева направо. Если первый символ это / , то путь адресации считается абсолютным (то есть от корня документа). При этом за узел контекста на первом шаге берется корневой элемент (html). Контекст — это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации мы получаем новый набор узлов документа, и этот набор становится контекстом для следующего шага адресации.

На втором шаге адресации (child::body) контекстом становится html элемент. Ось child:: говорит о том, что необходимо найти все непосредственные потомки элемента html, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить все узлы с именем body. В ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится элементом контекста для третьего шага.

Третий шаг адресации: child::* . Ось child:: собирает все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый набор нужно включить элементы основного типа с любым именем. В ходе этого шага получаем набор узлов, состоящий из трех элементов div и одного элемента img.

Четвёртый шаг адресации: child::span . Теперь контекстом является набор из четырёх элементов. И следующий набор узлов создается в четыре прохода (за четыре итерации). При первой итерации узлом контекста становится первый div. Согласно заданной оси child:: и правилу проверки span, в набор включаются непосредственные потомки div-а, имя которых равно span. При второй итерации в набор ничего добавлено не будет, так как у второго div нет потомков. Третья итерация добавит в набор сразу три элемента span, а четвёртая ничего не добавит, так как у элемента img нет потомков. Итак, в ходе проверки получен набор узлов, состоящий из четырёх элементов span. Это и будет контекстом для последующей обработки.

Следующего шага нет, поэтому будет производиться фильтрация отобранного набора. В этом и состоит отличие предикатов от шагов адресации. На каждом шаге адресации получаем новый набор, отталкиваясь от контекста, полученного на предыдущем шаге. В ходе же обработки предиката новый набор получается из текущего методом фильтрации, когда из набора исключаются узлы, не прошедшие условие проверки. В данном случае ось attribute:: говорит о необходимости проверить, если ли у узлов контекста атрибуты, а условие class требует оставить лишь те узлы, у которых задан атрибут с именем class. Фильтрация происходит за четыре итерации, но в окончательный набор попадают только два элемента span.

Оси

Оси — это база языка XPath.

  • ancestor:: — Возвращает множество предков.
  • ancestor-or-self:: — Возвращает множество предков и текущий элемент.
  • attribute:: — Возвращает множество атрибутов текущего элемента.
  • child:: — Возвращает множество потомков на один уровень ниже.
  • descendant:: — Возвращает полное множество потомков.
  • descendant-or-self:: — Возвращает полное множество потомков и текущий элемент.
  • following:: — Возвращает необработанное множество, ниже текущего элемента.
  • following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
  • namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
  • parent:: — Возвращает предка на один уровень назад.
  • preceding:: — Возвращает множество обработанных элементов исключая множество предков.
  • preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
  • self:: — Возвращает текущий элемент.

Существуют сокращения для некоторых осей, например:

  • attribute:: — можно заменить на «@»
  • child:: — часто просто опускают
  • descendant:: — можно заменить на «.//»
  • parent:: — можно заменить на «..»
  • self:: — можно заменить на «.»

Дополнением к базе является набор функций, которые делятся на 5 групп:

Системные функции

node-set document(object, node-set?) Возвращает документ, указанный в параметре object. string format-number(number, string, string?) Форматирует число согласно образцу, указанному во втором параметре, третий параметр указывает именованный формат числа, который должен быть учтён. string generate-id(node-set?) Возвращает строку, являющуюся уникальным идентификатором. node-set key(string, object) Возвращает множество с указанным ключом (аналогично функции id для идентификаторов). string unparsed-entity-uri(string) Возвращает непроанализированный URI, если такового нет, возвращает пустую строку. boolean element-available(string) Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath. boolean function-available(string) Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath. object system-property(string) Параметры, возвращающие системные переменные, могут быть: * xsl: version — возвращает версию XSLT процессора. * xsl: vendor — возвращает производителя XSLT процессора. * xsl: vendor-url — возвращает URL, идентифицирующий производителя. Если используется неизвестный параметр, функция возвращает пустую строку. boolean lang(string) Возвращает истину, если у текущего тега имеется атрибут xml: lang, либо родитель тега имеет атрибут xml: lang и в нем указан совпадающий строке символ.

Функции с множествами

  • * — обозначает любое имя или набор символов, @* — любой атрибут
  • $name — обращение к переменной, где name — имя переменной или параметра.
  • [] — дополнительные условия выборки
  • {} — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
  • / — определяет уровень дерева
node-set node() Возвращает все узлы. Для этой функции часто используют заменитель '*', но в отличие от звездочки — node() возвращает и текстовые узлы. string text() Возвращает набор текстовых узлов; node-set current() Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция. number position() Возвращает позицию элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number last() Возвращает номер последнего элемента в множестве. Корректно работает только в цикле <xsl:for-each/> number count(node-set) Возвращает количество элементов в node-set. string name(node-set?) Возвращает полное имя первого тега в множестве. string namespace-uri(node-set?) Возвращает ссылку на url определяющий пространство имён. string local-name(node-set?) Возвращает имя первого тега в множестве, без пространства имён. node-set id(object) Находит элемент с уникальным идентификатором

Строковые функции

string string(object?) Возвращает текстовое содержимое элемента. По сути возвращает объединенное множество текстовых элементов на один уровень ниже. string concat(string, string, string*) Объединяет две или более строк number string-length(string?) Возвращает длину строки. boolean contains(string, string) Возвращает истину, если первая строка содержит вторую, иначе возвращает ложь. string substring(string, number, number?) Возвращает строку вырезанную из строки начиная с указанного номера, и если указан второй номер — количество символов. string substring-before(string, string) Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки. string substring-after(string, string) Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки. boolean starts-with(string, string) Возвращает истину если вторая строка входит в начало первой, иначе возвращает ложь. boolean ends-with(string, string) Возвращает истину если вторая строка входит в конец первой, иначе возвращает ложь. string normalize-space(string?) Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами. string translate(string, string, string) Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. translate(«bar», «abc», «ABC») вернет BAr.

Логические функции

  • or — логическое «или»
  • and — логическое «и»
  • = — логическое «равно»
  • < (&lt;) — логическое «меньше»
  • > (&gt;) — логическое «больше»
  • <= (&lt;=) — логическое «меньше либо равно»
  • >= (&gt;=) — логическое «больше либо равно»
boolean boolean(object) Приводит объект к логическому типу; boolean true() Возвращает истину. boolean false() Возвращает ложь. boolean not(boolean) Отрицание, возвращает истину если аргумент ложь и наоборот.

Числовые функции

  • + — сложение
  • − — вычитание
  • * — умножение
  • div — обычное деление (не деление нацело!)
  • mod — остаток от деления
number number(object?) Переводит объект в число. number sum(node-set) Вернёт сумму множества, каждый тег множества будет преобразован в строку и из него получено число. number floor(number) Возвращает наибольшее целое число, не большее, чем аргумент. number ceiling(number) Возвращает наименьшее целое число, не меньшее, чем аргумент. number round(number) Округляет число по математическим правилам.

Ссылки

muller.academic.ru