T.M. SoftStudio

feci quod potui, faciant meliora potentes

Язык XPath 2.0

Язык XPath 2.0 опирается на новую, по сравнению с языком XPath 1.0, модель данных. Язык XPath 1.0 работает с четырьмя типами данных — наборы узлов, числа, строки, логические значения. В языке XPath 2.0 все данные — это последовательности.

Последовательность языка XPath 2.0 представляет собой упорядоченный набор объектов различных типов, которые могут быть атомарными значениями или узлами XML-документа. При этом последовательности не могут быть вложенными одна в другую. Любое выражение языка XPath 2.0 возвращает последовательность.

Узлы, входящие в последовательности, могут быть, также как и в языке XPath 1.0, семи типов — узлы документов, узлы элементов, узлы атрибутов, узлы пространств имен, узлы инструкций по обработке, узлы комментариев и текстовые узлы.

В языке XPath 2.0 корневой узел набора из семи типов узлов Xpath-дерева языка XPath 1.0 заменен узлом документа, т. к. язык XPath 2.0 позволяет, в отличие от языка XPath 1.0, для передачи результата от одного запроса другому генерировать деревья, корневые узлы которых могут отличаться от узла документа. Кроме того, узлы языка XPath 2.0 могут иметь тип данных (простой или сложный), определенный согласно схеме XML Schema.

XPath-дерево, корневым узлом которого является узел документа, называется документом, в противном случае Xpath-дерево называется фрагментом.

Атомарные значения языка XPath 2.0 могут иметь один из 19 простых типов, поддерживаемых XML Schema — это string, boolean, double, float, decimal, dateTime и т. д., 5 дополнительных простых типов данных, а также типы данных, являющиеся производными ограничением от этих простых типов.

Таким образом, язык XPath 2.0 значительно расширяет, по сравнению с языком XPath 1.0, возможности по обработке данных, обеспечивая полную поддержку типов данных XML Schema.

Каждый объект последовательности языка XPath 2.0 имеет значение и тип данных, который идентифицируется расширенным QName-именем (префикс + URI пространства имен + локальное имя) типа данных, поэтому можно сказать, что язык XPath 2.0 строго типизирован. Кроме того, каждый узел как объект последовательности, помимо значения и типа данных, имеет свой идентификатор. Это означает, что последовательность может содержать дубликаты, в отличие от наборов узлов языка XPath 1.0.

Пять вышеупомянутых дополнительных простых типов данных языка XPath 2.0 представлены следующим набором:

  • xs:untyped — тип данных узла элемента, не имеющий описания в XML-схеме;

  • xs:untypedAtomic — тип данных узла атрибута, не имеющий описания в XML-схеме;

  • xs:anyAtomicType — абстрактный тип данных, являющийся базовым для всех типов данных атомарных значений;

  • xs:dayTimeDuration — тип данных, представляющий последовательность из дня, часа, минут и секунд;

  • xs:yearMonthDuration — тип данных, представляющий последовательность из года и месяца.

Язык XPath 2.0 поддерживает комментарии для документирования Xpath-выражений. Такого рода комментарии представляют собой строки, ограниченные символами (: и :), и не влияют на обработку XPath-выражений. Также, язык XPath 2.0, в отличие от XPath 1.0, обеспечивает использование переменных в виде $[имя_переменной], которым можно присваивать значения.

Самой важной конструкцией языка XPath 2.0, также как и XPath 1.0, являются выражения пути, состоящие из шагов адресаций, разделенных оператором /, которые, в свою очередь, представляют собой последовательности из оси, условия отбора узлов и утверждений, уточняющих отбор узлов XML-документа.

В языке XPath 2.0 присутствуют оси языка XPath 1.0, за исключением оси namespace::, использование данной оси заменено вызовом функций in-scope-prefixes() и namespace-uri-for-prefix().

Сокращенный синтаксис шага адресации языка XPath 2.0 позволяет сделать следующие замены:

  • attribute:: — можно заменить символом @;

  • child:: — можно опустить;

  • descendant-or-self:: — можно заменить символами //;

  • parent:: — можно заменить двумя точками (..).

Точка (.) в языке XPath 2.0 является простым XPath-выражением (выражением контекста), а не сокращенным синтаксисом, как замена self:: в языке XPath 1.0. Выражение контекста возвращает объект контекста, т. е. объект, который обрабатывается в данный момент. Соответственно объект контекста может быть узлом или атомарным значением, тогда как в языке XPath 1.0 есть только узел контекста.

В отличие от XPath 1.0, условие отбора узлов языка XPath 2.0 дополнено следующими функциями:

  • item() — выбор любого объекта — узла или атомарного значения;

  • element() — выбор любого узла элемента;

  • schema-element(имя элемента) — выбор узла элемента с указанным именем и соответствующим типом данных, описанным в XML-схеме;

  • element(имя элемента) — выбор узла элемента с указанным именем без привязки к типу данных;

  • element(имя элемента, тип данных) — выбор узла элемента с указанным именем и типом данных;

  • element(*, тип данных) — выбор любого узла элемента с указанным типом данных;

  • attribute() — выбор любого узла атрибута;

  • attribute(имя атрибута) — выбор узла атрибута с указанным именем без привязки к типу данных;

  • attribute(*, тип данных) — выбор любого узла атрибута с указанным типом данных;

  • document-node() — выбор любого узла документа;

  • document-node(element(имя элемента)) — выбор узла документа, содержащего узел элемента с указанным именем.

Таким образом, язык XPath 2.0, в отличие от XPath 1.0, позволяет осуществлять выбор узлов не только по их имени, но и по их типу данных.

Существенным отличием от языка XPath 1.0 также является возможность использования в языке XPath 2.0, в качестве шагов адресаций, любых XPath-выражений, возвращающих последовательность узлов XML-документа.

Утверждения языка XPath 2.0, уточняющие отбор узлов в выражениях пути, представляют собой XPath-выражения, заключенные в квадратные скобки ([]).

Выражения пути языка XPath 2.0 возвращают упорядоченные последовательности узлов XML-документа, в которых исключены дубликаты.

XPath-выражения языка XPath 2.0 классифицируются как выражения пути, простые выражения, выражения последовательностей, арифметические выражения, выражения сравнения, логические выражения, выражения цикла, выражения условий, количественные выражения и выражения типа.

Простые выражения языка XPath 2.0 являются его основой и состоят из чисел, строк, переменных ($QName), XPath-выражений, заключенных в скобки (()), выражений контекста "." (возвращает объект контекста) и вызовов функций.

Выражения последовательностей предназначены для обработки последовательностей языка XPath 2.0 и содержат операторы конструирования, фильтрации и объединения последовательностей объектов.

Для создания последовательностей применяется оператор "запятая" (,), связывающий объекты последовательности, а также оператор to, определяющий диапазон целых чисел (например, 1 to 10).

Фильтрация последовательностей осуществляется с помощью утверждений — XPath-выражений, заключенных в квадратные скобки ([]). Утверждение, следующее за простым XPath-выражением, осуществляет фильтрацию последовательности, которую возвращает в качестве результата данное простое XPath-выражение.

Объединение последовательностей узлов возможно с использованием операторов:

  • union и | — простое объединение последовательностей узлов;

  • intersect — объединяет в последовательность, содержащую узлы, которые повторяются во всех объединяемых последовательностях;

  • except — объединяет в последовательность, содержащую узлы, которые не повторяются во всех объединяемых последовательностях.

При объединении последовательностей происходит исключение дубликатов.

Арифметические выражения используются для выполнения вычислений с числами и датами и содержат операторы +, -, *, div, idiv (деление с округлением до целого числа) и mod, возвращающие последовательность, состоящую из одного объекта.

Выражения сравнения возвращают true/false и содержат:

  • операторы сравнения двух величин:

    – eq — равно;

    – ne — не равно;

    – lt — меньше чем;

    – le — меньше чем или равно;

    – gt — больше чем;

    – ge — больше чем или равно;

  • общие операторы сравнения двух последовательностей — =, !=, <, <=, >, >=;

  • операторы сравнения двух узлов:

    – is — два объекта являются одним и тем же узлом;

    – << — один узел перед другим в иерархии документа;

    – >> — один узел после другого в иерархии документа.

Логические выражения возвращают true/false и содержат операторы:

  • or — возвращает true, если любой из объектов — true;

  • and — возвращает true, если оба объекта — true.

Выражения цикла содержат конструкцию

for переменная_диапазона in XPath-выражение return XPath-выражение

XPath-выражение, следующее после in, возвращает последовательность, определяющую диапазон для переменной диапазона. XPath-выражение, следующее после return, содержит переменную диапазона и вычисляет объекты последовательности, которую в итоге возвращает выражение цикла.

Выражения условий содержат конструкцию

if Xpath-выражение then Xpath-выражение else XPath-выражение

Выражение условия означает следующее: если XPath-выражение, следующее после if, равно true, тогда выполняется XPath-выражение, следующее после then, иначе выполняется XPath-выражение, следующее после else.

Количественные выражения возвращают true/false и содержат конструкции

some или every переменная_диапазона in XPath-выражение satisfies XPath-выражение

XPath-выражение, следующее после in, определяет диапазон для переменной диапазона. XPath-выражение, следующее после satisfies, содержит переменную диапазона и возвращает true/false для каждого значения переменной в определенном диапазоне.

В случае применения ключевого слова some количественное выражение возвращает true, если XPath-выражение, следующее после satisfies, хотя бы один раз возвратит true.

В случае применения ключевого слова every количественное выражение возвращает true, если XPath-выражение, следующее после satisfies, для каждого значения переменной диапазона возвратит true.

Выражения типа состоят из следующих конструкций:

  • XPath-выражение instance of тип — возвращает true, если объект, возвращаемый XPath-выражением, имеет указанный тип;

  • XPath-выражение cast as атомарный тип данных — приводит тип объекта, возвращаемого XPath-выражением, к указанному атомарному типу данных;

  • XPath-выражение castable as атомарный тип данных — возвращает true, если тип объекта, возвращаемый XPath-выражением, можно привести к указанному атомарному типу данных;

  • XPath-выражение treat as тип — является утверждением, что тип объекта, возвращаемый XPath-выражением, соответствует указанному типу. Если утверждение верно, то выражение возвращает объект, если нет — возникает ошибка.

Язык XPath 2.0 содержит библиотеку стандартных функций для использования в перечисленных далее XPath-выражениях.

Примечание

Префикс xs соответствует пространству имен http://www.w3.org/2001/XMLSchema. Префикс fn соответствует пространству имен http://www.w3.org/2005/xpath-functions. Префикс err соответствует пространству имен http://www.w3.org/2005/xqt-errors.

  • Функции оценки:

    – fn:node-name(имя узла) — возвращает расширенное QName-имя узла;

    – fn:nilled (имя узла) — возвращает true, если узел элемента содержит атрибут xsi:nil="true";

    – fn:string(объект) — конвертирует аргумент в строку. Если аргумент является узлом, тогда возвращает текстовое содержание узла;

    – fn:data(объекты) — конвертирует последовательность объектов в последовательность атомарных значений. Последовательность узлов конвертируется в последовательность связанных с ними значениями;

    – fn:base-uri(имя узла) — возвращает базовый URI-адрес узла;

    – fn:document-uri(имя узла документа) — возвращает URI-адрес документа.

  • Функция ошибок fn:error(сообщение об ошибке) завершает вычисление XPath-выражения — используется в случае, когда приложение определяет ошибку.

  • Функция анализа fn:trace(сообщение) — отладочная функция, выводит аргумент в диагностический поток (например, создается запись в файле регистрации).

  • Функции-конструкторы для типов данных:

    – xs:string($arg as xs:anyAtomicType?)

    - xs:boolean($arg as xs:anyAtomicType?)

    - xs:decimal($arg as xs:anyAtomicType?)

    - xs:float($arg as xs:anyAtomicType?)

    - xs:double($arg as xs:anyAtomicType?)

    - xs:duration($arg as xs:anyAtomicType?)

    - xs:dateTime($arg as xs:anyAtomicType?)

    - xs:time($arg as xs:anyAtomicType?)

    - xs:date($arg as xs:anyAtomicType?)

    - xs:gYearMonth($arg as xs:anyAtomicType?)

    - xs:gYear($arg as xs:anyAtomicType?)

    - xs:gMonthDay($arg as xs:anyAtomicType?)

    - xs:gDay($arg as xs:anyAtomicType?)

    - xs:gMonth($arg as xs:anyAtomicType?)

    - xs:hexBinary($arg as xs:anyAtomicType?)

    - xs:base64Binary($arg as xs:anyAtomicType?)

    - xs:anyURI($arg as xs:anyAtomicType?)

    - xs:QName($arg as xs:anyAtomicType?)

    - xs:normalizedString($arg as xs:anyAtomicType?)

    - xs:token($arg as xs:anyAtomicType?)

    - xs:language($arg as xs:anyAtomicType?)

    - xs:NMTOKEN($arg as xs:anyAtomicType?)

    - xs:Name($arg as xs:anyAtomicType?)

    - xs:NCName($arg as xs:anyAtomicType?)

    - xs:ID($arg as xs:anyAtomicType?)

    - xs:IDREF($arg as xs:anyAtomicType?)

    - xs:ENTITY($arg as xs:anyAtomicType?)

    - xs:integer($arg as xs:anyAtomicType?)

    - xs:nonPositiveInteger($arg as xs:anyAtomicType?)

    - xs:negativeInteger($arg as xs:anyAtomicType?)

    - xs:long($arg as xs:anyAtomicType?)

    - xs:int($arg as xs:anyAtomicType?)

    - xs:short($arg as xs:anyAtomicType?)

    - xs:byte($arg as xs:anyAtomicType?)

    - xs:nonNegativeInteger($arg as xs:anyAtomicType?)

    - xs:unsignedLong($arg as xs:anyAtomicType?)

    - xs:unsignedInt($arg as xs:anyAtomicType?)

    - xs:unsignedShort($arg as xs:anyAtomicType?)

    - xs:unsignedByte($arg as xs:anyAtomicType?)

    - xs:positiveInteger($arg as xs:anyAtomicType?)

    - xs:yearMonthDuration($arg as xs:anyAtomicType?)

    - xs:dayTimeDuration($arg as xs:anyAtomicType?)

    - xs:untypedAtomic($arg as xs:anyAtomicType?)

    - fn:dateTime($arg1 as xs:date?, $arg2 as xs:time?)

  • Функции обработки чисел:

    - fn:abs(число) — возвращает абсолютное значение числа;

    - fn:ceiling(число) — округляет число в большую сторону;

    - fn:floor(число) — округляет число в меньшую сторону;

    - fn:round(число) — округляет число;

    - fn:round-half-to-even(число, точность) — округляет число с указанной точностью.

  • Функции обработки строк:

    - fn:codepoints-to-string(числа) — создает строку из последовательности Unicode-кодировки;

    - fn:string-to-codepoints(строка) — возвращает последовательность Unicode-кодировки, соответствующую символам строки;

    - fn:compare(строка1, строка2, URI условия сопоставления) — сравнивает две строки с учетом условия сопоставления символов, возвращает –1, 0 и +1 если первая строка меньше, равна или больше второй строки;

    - fn:codepoint-equal(строка1, строка2) — сравнивает две строки в соответствии с Unicode-кодировкой, возвращает true/false;

    - fn:concat(атомарные значения) — конвертирует аргументы в строки, которые соединяет в результирующую строку;

    - fn:string-join(строки, строка-разделитель) — соединяет строки со строкой-разделителем;

    - fn:substring(строка, позиция, длина) — возвращает подстроку строки, начиная с указанной позиции и указанной длины;

    - fn:string-length(строка) — возвращает длину строки;

    - fn:normalize-space(строка) — удаляет пробелы в начале и в конце строки, заменяет последовательности символов пробелов на пробел;

    - fn:normalize-unicode(строка, форма нормализации Unicode) — нормализует строку согласно указанному алгоритму нормализации (NFC, NFD, NFKC, NFKD, FULLY-NORMALIZED);

    - fn:upper-case(строка) — переводит символы строки в верхний регистр;

    - fn:lower-case(строка) — переводит символы строки в нижний регистр;

    - fn:translate(строка, заменяемые символы, заменяющие символы) — заменяет символы в строке;

    - fn:encode-for-uri(URI-фрагмент) — нормализует URI-фрагменты;

    - fn:iri-to-uri(IRI) — конвертирует IRI в URI;

    - fn:escape-html-uri(строка с URI) — нормализует URI-адрес в строке;

    - fn:contains(строка1, строка2, условие сопоставления) — возвращает true, если первая строка содержит вторую с учетом условия сопоставления;

    - fn:starts-with(строка1, строка2, условие сопоставления) — возвращает true, если первая строка начинается второй с учетом сопоставления;

    - fn:ends-with(строка1, строка2, условие сопоставления) — возвращает true, если первая строка заканчивается второй с учетом сопоставления;

    - fn:substring-before(строка1, строка2, условие сопоставления) — возвращает подстроку первой строки, находящуюся перед второй строкой, которая является подстрокой первой строки, с учетом сопоставления;

    - fn:substring-after(строка1, строка2, условие сопоставления) — возвращает подстроку первой строки, находящуюся после второй строки, которая является подстрокой первой строки, с учетом сопоставления;

    - fn:matches(строка, регулярное выражение, способ сопоставления) — возвращает true, если строка согласуется с регулярным выражением в соответствии со способом сопоставления (i, m, s, x);

    - fn:replace(строка, регулярное выражение, замещающая строка, способ сопоставления) — заменяет в строке подстроку, соответствующую регулярному выражению с учетом способа сопоставления, замещающей строкой;

    - fn:tokenize(строка, регулярное выражение, способ сопоставления) — разделяет строку на последовательность подстрок согласно разделителю, соответствующему регулярному выражению.

  • Функция обработки идентификаторов fn:resolve-uri(относительный URI, базовый URI) конвертирует относительный URI-адрес в абсолютный URI-адрес.

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

    - fn:true() — возвращает true;

    - fn:false() — возвращает false;

    - fn:not(объект) — возвращает true, если объект — false, и наоборот.

  • Функции обработки дат:

    - fn:years-from-duration(период) — возвращает год;

    - fn:months-from-duration(период) — возвращает месяц;

    - fn:days-from-duration(период) — возвращает день;

    - fn:hours-from-duration(период) — возвращает час;

    - fn:minutes-from-duration(период) — возвращает минуты;

    - fn:seconds-from-duration(период) — возвращает секунды;

    - fn:year-from-dateTime(дата+время) — возвращает год;

    - fn:month-from-dateTime(дата+время) — возвращает месяц;

    - fn:day-from-dateTime(дата+время) — возвращает день;

    - fn:hours-from-dateTime(дата+время) — возвращает час;

    - fn:minutes-from-dateTime(дата+время) — возвращает минуты;

    - fn:seconds-from-dateTime(дата+время) — возвращает секунды;

    - fn:timezone-from-dateTime(дата+время) — возвращает временную зону;

    - fn:year-from-date(дата) — возвращает год;

    - fn:month-from-date(дата) — возвращает месяц;

    - fn:day-from-date(дата) — возвращает день;

    - fn:timezone-from-date(дата) — возвращает временную зону;

    - fn:hours-from-time(время) — возвращает час;

    - fn:minutes-from-time(время) — возвращает минуты;

    - fn:seconds-from-time(время) — возвращает секунды;

    - fn:timezone-from-time(время) — возвращает временную зону;

    - fn:adjust-dateTime-to-timezone(дата+время, временная зона) — модифицирует дату+время согласно временной зоне;

    - fn:adjust-date-to-timezone(дата, временная зона) — модифицирует дату согласно временной зоне;

    - fn:adjust-time-to-timezone(время, временная зона) — модифицирует время согласно временной зоне.

  • Функции обработки имени:

    - fn:resolve-QName(QName, узел элемента) — возвращает расширенное имя QName с учетом пространства имен узла элемента;

    - fn:QName(URI, QName) — возвращает расширенное имя QName;

    - fn:prefix-from-QName(расширенное QName) — возвращает префикс;

    - fn:local-name-from-QName(расширенное QName) — возвращает локальное имя;

    - fn:namespace-uri-from-QName(расширенное QName) — возвращает пространство имен;

    - fn:namespace-uri-for-prefix(префикс, узел элемента) — возвращает пространство имен, соответствующее префиксу узла элемента;

    - fn:in-scope-prefixes(узел элемента) — возвращает префикс узла элемента.

  • Функции обработки узлов:

    - fn:name(узел) — возвращает имя узла;

    - fn:local-name(узел) — возвращает локальное имя узла;

    - fn:namespace-uri(узел) — возвращает пространство имен узла;

    - fn:number(xs:anyAtomicType?) — конвертирует аргумент в значение типа xs:double;

    - fn:lang(язык, узел) — возвращает true, если значение атрибута xml:lang соответствует аргументу;

    - fn:root(узел) — возвращает корневой узел.

  • Функции обработки последовательностей:

    - fn:boolean(последовательность) — вычисляет true/false для последовательности;

    - fn:index-of(последовательность атомарных значений, атомарное значение, условие сопоставления) — возвращает позиции вхождения атомарного значения в последовательность с учетом условия сопоставления;

    - fn:empty(последовательность) — возвращает true, если аргумент — пустая последовательность;

    - fn:exists(последовательность) — возвращает false, если аргумент — пустая последовательность;

    - fn:distinct-values(последовательность атомарных значений, условие сопоставления) — устраняет дубликаты из последовательности;

    - fn:insert-before(последовательность1, позиция, последовательность2) — вставляет последовательность2 в последовательность1, начиная с указанной позиции;

    - fn:remove(последовательность, позиция) — удаляет из последовательности объект, находящийся на указанной позиции;

    - fn:reverse(последовательность) — меняет на противоположный порядок объектов в последовательности;

    - fn:subsequence(последовательность, позиция, длина) — возвращает часть последовательности, начиная с указанной позиции и имеющей указанную длину;

    - fn:unordered(последовательность) — меняет порядок объектов в последовательности. Изменение зависит от реализации XPath-процессора;

    - fn:zero-or-one(последовательность) — возвращает последовательность, если она содержит не более одного объекта, иначе — возникает ошибка;

    - fn:one-or-more(последовательность) — возвращает последовательность, если она содержит более одного объекта, иначе — возникает ошибка;

    - fn:exactly-one(последовательность) — возвращает последовательность, если она содержит один объект, иначе — возникает ошибка;

    - fn:deep-equal(последовательность1, последовательность2, условие сопоставления) — возвращает true, если объекты двух последовательностей равны друг другу;

    - fn:count(последовательность) — возвращает количество объектов в последовательности;

    - fn:avg(последовательность атомарных значений) — возвращает среднее последовательности значений;

    - fn:max(последовательность атомарных значений, условие сопоставления) — возвращает максимальное значение в последовательности;

    - fn:min(последовательность атомарных значений, условие сопоставления) — возвращает минимальное значение в последовательности;

    - fn:sum(последовательность атомарных значений) — возвращает сумму значений последовательности;

    - fn:id(ID, идентификатор документа) — возвращает последовательность узлов документа, имеющих указанное значение атрибута ID;

    - fn:idref(IDREF, идентификатор документа) — возвращает последовательность узлов документа, имеющих указанное значение атрибута IDREF;

    - fn:doc(URI-адрес) — находит документ по указанному URI-адресу и возвращает узел документа;

    - fn:doc-available(URI-адрес) — возвращает true, если документ доступен по указанному URI-адресу;

    - fn:collection(URI-адрес) — возвращает последовательность узлов, идентифицируемых указанным URI-адресом.

  • Функции контекста:

    - fn:position() — возвращает позицию контекста при обработке последовательности;

    - fn:last() — возвращает количество объектов обрабатываемой последовательности — размер контекста;

    - fn:current-dateTime() — возвращает системные дату и время;

    - fn:current-date() — возвращает системную дату;

    - fn:current-time() — возвращает системное время;

    - fn:implicit-timezone() — возвращает системную временную зону;

    - fn:default-collation() — возвращает условие сопоставления по умолчанию;

    - fn:static-base-uri() — возвращает базовый URI-адрес документа.