Введение

XPath 2.0 — это версия языка XPath, определённая консорциумом World Wide Web Consortium (W3C). Она получила статус рекомендации 23 января 2007 года. Как рекомендация W3C, она была заменена XPath 3.0 10 апреля 2014 года. XPath используется главным образом для выбора фрагментов XML-документа. Для этого XML-документ представляется в виде дерева узлов. XPath позволяет выбирать узлы посредством иерархического пути навигации по дереву документа. Язык значительно больше своего предшественника, XPath 1.0, и некоторые базовые концепции, такие как модель данных и система типов, были изменены. Поэтому обе версии языка описываются в отдельных статьях. XPath 2.0 используется как подязык XSLT 2.0, а также является подмножеством XQuery 1.0. Все три языка используют одну и ту же модель данных (XDM), систему типов и библиотеку функций, и были разработаны совместно и опубликованы в один день.

Модель данных

Каждое значение в XPath 2.0 является последовательностью элементов. Этими элементами могут быть узлы или атомарные значения. Отдельный узел или атомарное значение рассматривается как последовательность длиной один. Последовательности не могут быть вложенными. Узлы бывают семи видов, соответствующих различным конструкциям в синтаксисе XML: элементы, атрибуты, текстовые узлы, комментарии, инструкции по обработке, узлы пространств имен и узлы документов. (Узел документа заменяет корневой узел XPath 1.0, поскольку модель XPath 2.0 позволяет строить деревья, имеющие в качестве корня узлы других типов, в частности элементы.) Узлы могут быть типизированными или нетипизированными. Узел получает тип в результате валидации по отношению к XML-схеме. Если элемент или атрибут успешно проходит валидацию по отношению к определенному сложному или простому типу, определенному в схеме, имя этого типа присоединяется к узлу в качестве аннотации и определяет результат операций, применяемых к этому узлу: например, при сортировке узлы, аннотированные как целые числа, будут сортироваться как целые числа. Атомарные значения могут принадлежать любому из 19 примитивных типов, определенных в спецификации XML Schema (например, строка, логическое, double, float, decimal, dateTime, QName и т. д.). Они также могут принадлежать к типу, производному от одного из этих примитивных типов: либо встроенному производному типу, такому как integer или Name, либо пользовательскому производному типу, определенному в пользовательской схеме.

Система типа

Система типов XPath 2.0 примечательна тем, что сочетает в себе строгую и слабую типизацию в рамках одного языка. Операции, такие как арифметические вычисления и булево сравнение, требуют атомные значения в качестве операндов. Если операнд возвращает узел (например, @price * 1.2), то этот узел автоматически атомизируется для извлечения атомного значения. Если входной документ был проверен на соответствие схеме, то узел обычно будет иметь аннотацию типа, которая и определит тип результирующего атомного значения (в данном примере атрибут цены может иметь тип decimal). Если схема не используется, узел будет нетипизированным, а тип результирующего атомного значения будет untypedAtomic. Типизированные атомные значения проверяются на соответствие подходящему типу для контекста их использования: например, умножение даты на число невозможно. Нетипизированные атомные значения, напротив, подчиняются слабой дисциплине типизации: они автоматически преобразуются в тип, подходящий для выполняемой операции; например, при арифметической операции нетипизированное атомное значение преобразуется в тип double.

Выражения пути

Пути расположения XPath 1.0 в XPath 2.0 именуются как выражения путей. Неформально, выражение пути представляет собой последовательность шагов, разделенных оператором "/", например a/b/c (что является сокращением от child::a/child::b/child::c). Однако, более формально, "/" – это просто двоичный оператор, который применяет выражение, находящееся справа, к каждому элементу, последовательно выбранному выражением слева. Таким образом, в этом примере выражение a выбирает все дочерние элементы контекстного узла с именем <a>; выражение child::b затем применяется к каждому из этих узлов, выбирая все дочерние элементы <b> элементов <a>; и выражение child::c затем применяется к каждому узлу в этой последовательности, выбирая все дочерние элементы <c> этих элементов <b>. Оператор "/" обобщен в XPath 2.0, чтобы разрешить использование любого выражения в качестве операнда: в XPath 1.0 правая часть всегда представляла собой шаг оси. Например, с правой стороны может быть использован вызов функции. Правила типизации для этого оператора требуют, чтобы результатом первого операнда была последовательность узлов. Правый операнд может возвращать либо узлы, либо атомарные значения (но не их смесь). Если результат состоит из узлов, то дубликаты удаляются, и узлы возвращаются в порядке документа – порядке, определяемом относительными позициями узлов в исходном XML-дереве. Во многих случаях операндами "/" будут шаги оси: они в значительной степени не изменились по сравнению с XPath 1.0 и описаны в статье, посвященной XPath 1.0.

Другие операторы

Другие операторы, доступные в XPath 2.0, включают следующее:

Операторы Эффект Арифметические операции над числами, датами и длительностями Общее сравнение: сравнение произвольных последовательностей. Результат – истина, если хотя бы одна пара элементов, по одному из каждой последовательности, удовлетворяет условию сравнения Сравнение значений: сравнение отдельных элементов Сравнение идентичности узлов: истина, если оба операнда ссылаются на один и тот же узел Сравнение позиций узлов в порядке документа Сравнение последовательностей узлов как множеств, возвращающее объединение, пересечение или разность множеств Логическое И и ИЛИ. Отрицание достигается с помощью функции `not` Определяет диапазон целых чисел, например от 1 до 10 Определяет, является ли значение экземпляром заданного типа Преобразует значение в заданный тип Проверяет, может ли значение быть преобразовано в заданный тип

Условные выражения могут быть записаны с использованием синтаксиса
XPath 2.0 также предлагает выражение `for`, которое является небольшим подмножеством выражения FLWOR из XQuery. Выражение вычисляет выражение Y для каждого значения в результате выражения X по очереди, обращаясь к этому значению с помощью переменной `$x`.

Обратная совместимость

Из-за изменений в модели данных и системе типов, не все выражения в XPath 2.0 имеют тот же эффект, что и в XPath 1.0. Основное различие заключается в том, что XPath 1.0 был более снисходителен к преобразованию типов: например, сравнение двух строк ("4" > "4.0") было допустимо и выполнялось как числовое сравнение. В XPath 2.0 такое сравнение определяется как сравнение двух значений как строк, с использованием контекстно-зависимой последовательности сопоставления. Для облегчения перехода, XPath 2.0 определяет режим выполнения, в котором семантика изменяется, чтобы быть максимально приближенной к поведению XPath 1.0. При использовании XSLT 2.0 этот режим активируется установкой атрибута version="1.0" в элементе xsl:stylesheet. Это не гарантирует 100% совместимости, но любые оставшиеся различия, скорее всего, проявятся только в редких случаях.

Поддержка

Поддержка XPath 2.0 пока что ограничена.