69057

Обработка документов XML. Вспомогательные языки XML. Язык XPath

Лекция

Информатика, кибернетика и программирование

Язык XML предоставляет многообразные, гибкие и эффективные возможности описания структуры данных. Однако он не обеспечивает средств для навигации в документе и поиска компонент структурированных данных внутри документа, например, для поиска наименований книг по фамилии автора.

Русский

2014-09-29

406 KB

2 чел.

 33

Лекция 4-05

Раздел  5. Обработка документов XML

Тема 5.1. Вспомогательные языки XML

5.1.1. Язык XPath

 5.1.1.1. Назначение и спецификации языка XPath

 5.1.1.2. Типы данных в языках XPath и XQuery

 5.1.1.3. Выражения XPath

 5.1.1.3.1. Переменные и литералы

 5.1.1.3.2. Числовые выражения

 5.1.1.3.3. Выражения отношения

 5.1.1.3.4. Булевские выражения

 5.1.1.3.5. Выражения для типов последовательности

 5.1.1.3.6. Условное выражение

 5.1.1.3.7. Последовательности

 5.1.1.3.8. Циклы

 5.1.1.3.9. Квантификаторы

 5.1.1.3.10. Выражения для последовательностей узлов

 5.1.1.3.11. Приоритет операций

 5.1.1.4. Функции и операторы XPath и XQuery

 5.1.1.4.1. Функции-конструкторы

 5.1.1.4.2. Числовые операторы и функции

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

  5.1.1.4.3.1. Функции сборки-разборки строк

  5.1.1.4.3.2. Функции сравнения строк

  5.1.1.4.3.3. Функции строковых значений

  5.1.1.4.3.4. Функции поиска соответствия в строках

5.1.1.4.3.5. Функции с использованием регулярных выражений

 5.1.1.4.4. Булевские функции и операторы

 5.1.1.4.5. Функции и операторы для продолжительности, дат и времени 

 5.1.1.4.5.1. Операторы сравнения

 5.1.1.4.5.2. Функции извлечения компонент

 5.1.1.4.5.3. Арифметические операторы для продолжительности, дат и времени

 5.1.1.4.6. Функции для узлов

 5.1.1.4.7. Функции и операторы для последовательностей

 5.1.1.4.7.1. Общие функции и операторы 

 5.1.1.4.7.2. Функции проверки количества элементов в последовательности

 5.1.1.4.7.3. Функции и операторы для операций с множествами

 5.1.1.4.7.4. Агрегатные функции

 5.1.1.4.7.5. Функции, генерирующие последовательности

 5.1.1.4.8. Контекстные функции

 5.1.1.5. Пути адресации в XPath

 5.1.1.5.1. Синтаксис путей адресации

 5.1.1.5.2. Шаги адресации

 5.1.1.5.3. Оси

 5.1.1.5.4. Правила проверки

 5.1.1.5.5. Предикаты

 5.1.1.5.6. Сокращенный синтаксис путей адресации

 

Раздел 5. Обработка документов XML

Тема 5.1. Вспомогательные языки XML

5.1.1. Язык XPath 

5.1.1.1. Назначение и спецификации языка XPath

Язык XML предоставляет многообразные, гибкие и эффективные возможности описания структуры данных. Однако он не обеспечивает средств для навигации в документе и поиска компонент структурированных данных внутри документа, например, для поиска наименований книг по фамилии автора.

Для выполнения часто встречающихся задач такого рода был создан язык путей XMLXML Path Language (или сокращенно XPath). Версия 1.0 рекомендации XPath была принята W3C в ноябре 1999 года.

Следующая версия XPathXPath 2.0 была принята в январе 2007 г. Во время разработки и обсуждения этой версии параллельно создавался язык запросов к документам XML – XQuery (наподобие языка SQL для баз данных). Этот язык создавался как расширение языка XPath. Поэтому, наряду с отдельными спецификациями для языков XPath и XQuery, консорциум W3C выпустил несколько совместных спецификаций для этих языков по моделям данных, формальной семантики, а также функциям и операторам.

Помимо языка XQuery, язык XPath используется также в схемах (при задании ключей и ссылок на ключи), а также в языке XSLT.

5.1.1.2. Типы данных в языках XPath и XQuery

В языке XPath, а также в языке XQuery, используются те же типы данных, что и в схеме XML, дополненные типами данных, введенными для этих языков.

Иерархия данных XPath и XQuery представлена на рис. 5.1.1.

Рис. 5.1.1. Иерархия данных XPath и XQuery

В языках XPath и XQuery добавлены следующие типы данных:

  •  xs:anyAtomicType – любой атомарный, т.е. состоящий из одного значения, тип;
  •  xs:untypedAtomic – любое атомарное данное, которому не может быть приписан какой-либо определенный тип;
  •  xs:untyped – узел элемента, который не проверялся при проверке документа XML или проверка которого была пропущена;
  •  xs:yearMonthDuration – продолжительность в годах и месяцах (производное от   xs:duration);
  •  xs:dayTimeDuration – продолжительность в днях, часах, минутах и секундах (производное от xs:duration).

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

В XPath определено семь типов узлов и, соответственно, семь типов данных, представленных на рис. 5.1.1:

  •  узел документа;
  •  элемент;
  •  атрибут;
  •  текст;
  •  комментарий;
  •  инструкция по обработке;
  •  пространство имен.

Каждый узел дерева XPath имеет строковое представление, называемое строковым значением, которое XPath использует для сравнения узлов.

Для всех узлов в документе определяется порядок, называемый порядком появления в документе. Он соответствует появлению узлов в XML представлении документа после расшифровки всех общих сущностей.  Следовательно, корневой узел всегда будет первым узлом, а узлы элементов будут предшествовать своим непосредственным потомкам. Таким образом, порядок появления в документе упорядочивает узлы элементов согласно очередности появления в XML документе соответствующих открывающих дескрипторов (после подстановки всех сущностей). Считается, что в элементе узлы атрибутов и пространств имен всегда предшествуют непосредственным потомкам элемента. При этом узлы пространств имен предшествуют узлам атрибутов. Относительный порядок следования узлов пространства имен и относительный порядок следования узлов атрибутов зависят от реализации. Обратный порядок появления в документе – это порядок, обратный порядку появления в документе.

Узел документа представляет весь документ. Непосредственными потомками узла документа являются корневой элемент, а также узлы комментариев и инструкций по обработке. Имя узла документа совпадает с именем корневого элемента.  Строковое значение узла документа является объединением строковых значений всех текстовых узлов, являющихся потомками этого узла, выстроенными согласно порядку появления в документе.

Корневой узел не имеет расширенного имени.

Для каждого элемента в документе создается узел элемента. Узел элемента имеет расширенное имя, однако если имя не имеет префикса, URI пространства имен для имени элемента будет нулевым.  Непосредственными потомками узла элемента могут быть узлы элементов, узлы комментариев, узлы инструкций обработки и текстовые узлы, образующие его содержание. При этом обрабатываются ссылки на внутренние и внешние сущности, а также выполняется подстановка для ссылок на символы.

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

Узел элемента может иметь уникальный идентификатор (ID). Значение этого атрибута декларируется в DTD как тип ID. Никакие два элемента в пределах одного документа не могут иметь одинаковые уникальные идентификаторы.

С каждым узлом элемента связан набор узлов атрибутов. При этом, хотя сам элемент является родителем каждого из этих узлов атрибутов (в отличие от модели DOM), узел атрибута непосредственным потомком своего родительского элемента не является.

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

Атрибут, подставляемый по умолчанию, обрабатывается так же, как атрибут, указанный явно. Если для данного типа элемента в DTD атрибут был объявлен со значением по умолчанию #IMPLIED, однако в элементе этот атрибут представлен не был, считается, что в наборе атрибутов указанного элемента нет узла для этого атрибута.

Узел атрибута имеет расширенное имя. Если имя атрибута не имеет префикса, URI пространства имен для имени атрибута будет нулевым. Узел атрибута также имеет нормализованное строковое значение, равное значению атрибута (с удаленными избыточными пробельными символами).  

Для атрибутов, декларирующих пространства имен, соответствующих узлов атрибутов не предусмотрено.

Текстовый узел представляет символьные данные элемента. Все символы в секции CDATA обрабатываются как символьные данные. Таким образом, запись <![CDATA[<]]> в исходном документе будет обрабатываться так же, как и &lt;. Таким образом, секция CDATA обрабатывается так, словно были удалены комбинации "<![CDATA[" и "]]>", а все символы "<" и "&" были заменены на &lt; и &amp; соответственно.

Строковым значением текстового узла являются символьные данные, содержащиеся в узле. Расширенного имени этот узел не имеет.

Узел комментария представляет комментарий XML (за исключением комментариев в DTD). Его строковым значением являются содержимое комментария (не включая "<!--" и  "-->"). Расширенного имени этот узел также не имеет.

Для каждой инструкции обработки создается соответствующий узел. Исключение составляют инструкции обработки, помещенные в DTD. Строковое значение узла инструкции обработки – это та часть инструкции обработки, которая следует за адресатом и возможным пробельным символом. В состав строкового значения также не попадает завершающая комбинация "?>". Инструкция обработки имеет расширенное имя, в котором локальная часть – это адресат инструкции обработки, а URI пространства имен является нулевым.

С каждым элементом связан набор узлов пространства имен: по одному на каждый новый префикс пространства имен, появившийся в области видимости этого элемента, (включая и префикс xml), и еще один узел для пространства имен по умолчанию, если такое пространство имен имеется в области видимости элемента. Данный элемент является родителем каждого такого узла пространства имен, однако узел пространства имен непосредственным потомком соответствующего элемента родителя не становится. Элемент получит узел пространства имен:

  •  для каждого атрибута элемента, чье имя начинается с xmlns:,
  •  для каждого атрибута в элементе-предке, чье имя начинается с xmlns:, при условии, что данный префикс не был затем переопределен самим элементом или его более близким предком,
  •  для атрибута xmlns, если сам элемент или какой-либо из его предков имеют атрибут xmlns и при этом атрибут xmlns самого ближайшего из таких элементов не является пустым.

Узел пространства имен имеет расширенное имя, локальная часть которого является префиксом пространства имен (она является пустой, если данный узел относится к пространству имен по умолчанию), а идентификатор URI пространства имен всегда нулевой.

Строковое значение узла пространства имен – это URI пространства имен, связанного с данным префиксом пространства имен. Если данный URI окажется относительным, он должен обрабатываться точно так же, как URI пространства имен в расширенном имени.

5.1.1.3. Выражения XPath

Главной синтаксической конструкцией языка XPath является выражение. Для группировки выражений можно использовать круглые скобки. Приоритеты при выполнении операций в выражениях определяются так же, как в языках программирования. Для изменения приоритета  вычисления выражений можно использовать круглые скобки.

В результате обработки выражения XPath получается последовательность узлов и/или атомарные значения.

5.1.1.3.1. Переменные и литералы

Имя переменной – это имя типа QName (см. рис. 5.5.1), перед которым ставится символ "$".  В самом языке XPath переменные явно не определены, однако они используются в языках XQuery и XSLT.

Булевские литералы (типа xs:boolean) задаются в XPath как true или false. Числовые литералы (типов xs:integer, xs:decimal и xs:double и производных типов) задаются как целые числа, либо числа с десятичной точкой, либо числа в формате с плавающей точкой. Строковые литералы (типа xs:string и производных типов) заключаются либо в двойные, либо в одиночные апострофы.

5.1.1.3.2. Числовые выражения

Числовые выражения используются для выполнения арифметических операций над числами.

В XPath определены следующие арифметические операторы:

  •  + – сложение;
  •  - – вычитание;
  •  * – умножение;
  •  div – деление;
  •  idiv – деление двух целых чисел;
  •  mod – взятие модуля (определение остатка от деления чисел).

Арифметические операции могут, кроме idiv и mod, могут использоваться и для следующих типов дат и времени: xs:dateTime, xs:date, xs:time, xs:dayTimeDuration и xs:yearMonthDuration. Арифметические операции могут также использоваться со строками, если они содержат числа.

Поскольку символ "-" может использоваться в XML в именах переменных, при записи операции вычитания оператор  "-" должен быть отделен от первого операнда (вычитаемого) по крайней мере одним пробелом.

Примеры числовых выражений:

1. 3+2 – равно 5.

2. 5 div 2 – равно 2.5.

3. 5 idiv 2 – равно 2.

4. 5 mod 2 – равно 1.

5. $a1 - 1 – равно текущему значению переменной $a1 минус 1.

6. $a1-1 – будет воспринято как переменная с именем $a1-1.

7. $a1+$a2*$a3 – равно текущему значению переменной $a2, умноженной на текущее значение $a3 плюс текущее значение $a1.

8. $a1*($a2+$a3) – равно сумме текущих  значений переменных $a2 и $a3 умноженной на текущее значение $a1.

9. "2"+"1.2e1" – равно 14.

5.1.1.3.3. Выражения отношения

Выражения отношения используются для сравнения двух значений. Результатом выражения отношения является булевское значение true или false. В XPath определены три типа выражений сравнения:

  •  сравнение значений;
  •  общее сравнение;
  •  сравнение узлов.

Сравнение значений производится для двух одиночных значений и использует следующие операции отношения:

  •  gt – больше;
  •  lt – меньше;
  •  ge – больше или равно;
  •  le – меньше или равно;
  •  eq – равно;
  •  ne – не равно.

Примеры сравнения значений:

1. 5 gt 3 – равно true.

2. 5 ne 5 – равно false.

3. 5 eq 5 – равно true.

4. 5 ge 5 – равно true.

При общем сравнении операнды сначала преобразуются в данные одного типа, а затем сравниваются как при сравнении значений. Если операнды содержат списки, сравнение значений выполняется для каждого элемента списка. Для общего сравнения определены следующие операторы отношения:

  •  > – больше;
  •  < – меньше;
  •  >= – больше или равно;
  •  <= – меньше или равно;
  •  = – равно;
  •  != – не равно.

Примеры общего сравнения:

1. 5 > 3 – равно true.

2. (1,2) = (2,3) – равно true.

3. (1,2) = (3,4) – равно false.

4. (1,2) != (2,3) – равно true.

Для сравнения узлов определены следующие операторы:

  •  is – проверка узлов-операндов на равенство;
  •  << – проверка на предшествование первого узла-операнда второму узлу-операнду;
  •  >> – проверка на предшествование второго узла-операнда первому узлу-операнду.

Примеры сравнения узлов:

1. /book-description/book/publisher [@genre="классика"] is

/book-description/book/publisher[@year="2005"] – равно true, если для элемента publisher значение атрибута genre равно "классика" и значение  атрибута year равно "2005".  

2. /book-description/book/publisher[@year="2005"] <<

/book-description/book/publisher[@year="2006"] – равно true, если для элемент publisher со значением  атрибута year, равным "2005", предшествует элементу publisher со значением  атрибута year, равным "2006".

5.1.1.3.4. Булевские выражения

Булевские выражения  используются для выполнения логических операций И и ИЛИ. В XPath определены два логических оператора: оператор or для выполнения операции ИЛИ и оператор and для выполнения операции И. Операндами и результатом булевского выражения являются булевские значения. Для операции отрицания используется функция not().

Примеры булевских выражений:

1. 5 gt 1 and 5 lt 10 – равно true.  

2. -5 gt 1 or 5 lt 10 равно true.

3. not(5 gt 1) – равно false.

5.1.1.3.5. Выражения для типов последовательности

Для проверки и изменения типов в последовательности данных в  XPath определены операции instance of, cast, castable и treat.  

Операция instance of имеет следующий формат:

операнд-1 instance of операнд-2

Эта операция проверяет наличие операнда-1 в последовательности, заданной в операнде-2 и возвращает true, если операнд есть в последовательности и false – в противном случае.

Примеры выражений для операции instance of:

1. 12 instance of xs:integerравно true.

2. 12 instance of xs:nonPositiveIntegerравно false.

Операция cast as имеет следующий формат:

операнд-1 cast as операнд-2[?]

Эта операция преобразует атомарное значение в операнде-1 в данное типа, заданного в операнде-2 и возвращает преобразованное значение, одновременно изменяя тип операнда-1. Если после операнда-2 задан необязательный символ "?", то в случае невозможности преобразования возвращается пустая строка, иначе выдается сообщение об ошибке. Операнд-2 не может иметь тип xs:NOTATION или тип xs:anyAtomicType.

Примеры выражений для операции cast as:

1. "12" cast as xs:integer преобразует строку в число.

2. $d cast as xs:string – преобразует переменную $d к строковому типу.

Операция castable as имеет следующий формат:

операнд-1 castable as операнд-2[?]

Эта операция выполняет проверку возможности преобразования атомарного значения в операнде-1 в данное типа, заданного в операнде-2 и возвращает значение true, если такое преобразование возможно и false – в противном случае. Задание  после операнда-2 необязательного символ "?" определяет возможность задания пустой последовательности.  Операнд-2 не может иметь тип xs:NOTATION или тип xs:anyAtomicType.

Примеры выражений для операции castable as:

1. "12" castable as xs:integer равно true.

2. "12.3" castable as xs:integerравно false.

Операция treat as имеет следующий формат:

операнд-1 treat as операнд-2

Эта операция преобразует атомарное значение в операнде-1 в данное типа, заданного в операнде-2 и возвращает преобразованное значение, однако, в отличие от операции cast as, тип операнда-1 не меняется. Операнд-2 не может иметь тип xs:NOTATION или тип xs:anyAtomicType. 

Обычно операция treat as используется при вызове функций, когда аргумент должен иметь тип операнд-2.

Примеры выражений для операции treat as:

1. "12" treat as xs:integer преобразует строку в число.

2. $d treat as xs:string – возвращает текущее значение переменной, преобразованное к строковому типу (тип самой переменной $d не меняется).

5.1.1.3.6. Условные выражения

Условное выражение в XPath имеет следующий формат:

if (условие) then выражение-1 else выражение-2

Сначала вычисляется выражение условие, результат которого должно иметь тип xs:boolean. Если результат равен true, то вычисляется выражение-1 и его результат становится результатом условного выражения. В противном случае (если результат равен false) вычисляется выражение-2 и его результат становится результатом условного выражения. Ветвь else в выражении является обязательной.

 

 

Примеры условного выражения:

1. if($a1 instance of xs:integer and 

$a2 instance of xs:integer) then $a1 idiv $a2

else $a1 div $a2 – если  и $a1  и $a2 – целые числа, то разделить нацело, иначе разделить как два вещественных числа.

2. if($x castable as xs:integer) then $x cast as xs:integer

else $x cast as xs:string – если значение $x  можно преобразовать в целое число, преобразовать к целому типу, иначе преобразовать к строковому типу.

5.1.1.3.7. Последовательности

В языке XPath определены выражения, содержащие последовательности данных, заключенные в круглые скобки и отделенные друг от друга запятыми. Элементами последовательности могут быть переменные, атомарные значения или узлы. Если элементы последовательности – целые числа, их можно задать с помощью диапазона значений, который имеет следующий формат:

начальное-значение to конечное-значение

Примеры последовательностей:

1. (1, 3, 5, 7, 9) – последовательность целых чисел 1, 3, 5, 7 и 9.

2. (1 to 10, 15) – последовательность целых чисел от 1 до 10 и число 15.

3. ($a1, $a2) – последовательность из двух переменных: $a1 и $a2.  

5.1.1.3.8. Циклы

Цикл в XPath имеет следующий формат:

for $имя-1 in выражение-1 [, $имя-2 in выражение-2 …]

return выражение

Переменные $имя-1, $имя-2 и т.д. являются переменными цикла. Цикл может содержать одну или несколько переменных цикла. Если цикл содержит две и более переменных цикла, то циклы являются вложенными, т.е. цикл, содержащий  переменную $имя-1, является внешним, цикл, содержащий  переменную $имя-2, является вложенным во внешний цикл и т.д.

Переменные цикла последовательно принимают значения узлов и/или атомарных значений, полученных в результате вычисления своего выражения. При этом каждый раз вычисляется выражение после слова return., которое и является результатом выполнения выражения.

 

Примеры циклов:

1. for $a in (1 to 5) return $a – цикл возвращает последовательность чисел от 1 до 5.

2. for $a in (1 to 3), $b in (1, 2) return $a + $b – цикл возвращает последовательность чисел 2, 3, 3, 4, 4, 5.

5.1.1.3.9. Квантификаторы

Квантификаторы в XPath определяют либо существование хотя бы одного узла последовательности с определенным свойством, либо выделение всех  узлов последовательности с определенным свойством.

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

some $имя-1 in выражение-1 [, $имя-2 in выражение-2 …]

satisfies выражение 

Сначала вычисляется выражение-1. Затем переменная последовательно принимает значения узлов и/или атомарных значений, полученных в результате вычисления своего выражения. При этом каждый раз вычисляется из последовательности узлов, полученной в результате вычисления выражения-1. Аналогичным образом выполнятся операции и для остальных имен и выражений. Все полученные значения каждый раз подставляются в выражение. Как только одно из значений   выражения станет равным true, вычисления прекращаются  и квантификатор возвращает true. Если все возвращаемые в ходе подстановки значения возвращают false, квантификатор возвращает false.

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

every $имя-1 in выражение-1 [, $имя-2 in выражение-2 …]

satisfies выражение 

Вычисление значения выполняется также как для предыдущего квантификатора, но  квантификатор возвращает true, только если все подстановки возвращают true. Если при очередной подстановке возвращается значение false,  вычисления прекращаются  и квантификатор возвращает false.

Примеры квантификаторов:

1. some $a in (1, 2, 3, 4), $b in (1, 2)

satisfies $a + $b = 5возвращает true.

2. every $i in (1, 4.8, 12, 42)

satisfies $i instance of xs:integer возвращает false.

5.1.1.3.10. Выражения для последовательностей узлов

Язык XPath рассматривает последовательности узлов дерева документа XML как элементы множества. Для этих множеств элементов определены операции объединения, пересечения и дополнения.

Операция объединения последовательностей узлов записывается в виде

операнд-1 union операнд-2

или

операнд-1 | операнд-2.

Значениями  операнда-1 и операнда-2 являются две последовательности узлов. Результатом выполнения операции является последовательность узлов, содержащая все узлы операнда-1 и операнда-2 (одинаковые узлы появляются в результирующей последовательности только один раз).

Операция пересечения последовательностей узлов записывается в виде

операнд-1 intersect операнд-2.

Значениями  операнда-1 и операнда-2 являются две последовательности узлов. Результатом выполнения операции является последовательность узлов, содержащая только общие узлы операнда-1 и операнда-2.

Операция дополнения последовательностей узлов записывается в виде

операнд-1 except операнд-2.

Значениями  операнда-1 и операнда-2 являются две последовательности узлов. Результатом выполнения операции является последовательность узлов, содержащая только те узлы операнда-1, которые не содержатся в операнде-2.

Примеры выражений для последовательностей узлов:

1. (A,B,C,G) union (A,С,D,F) – результатом будет последовательность узлов (A,B,C,G,D,F).

2. (A,B,C,G) intersect (A,С,D,F) – результатом будет последовательность узлов (A,C).

3. (A,B,C,G) except (A,С,D,F) – результатом будет последовательность узлов (B,G).

5.1.1.3.11. Приоритет операций

В XPath определен следующий приоритет операций (в порядке убывания приоритета):  

  •  раскрытие скобок – (), [] или {}.
  •  операции с путями выборки;
  •  унарная операция отрицания (-);
  •  операция приведения типа (cast);
  •  операция проверки возможности приведения типа (castable);
  •  операция приведения значения типа (treat);
  •  операция проверки типа (instance of);
  •  операции пересечения и дополнения множеств(intersect и except);
  •  операция объединения множеств (| или union);
  •  операции умножения, деления, деления нацело и вычисление остатка от деления (*, div, idiv и mod);
  •  операции сложения и вычитания (+ и -);
  •  операция диапазона (to);
  •  операции сравнения (eq, ne, lt, le, gt, ge, =, != , <, <=, >, >=, is, <<, >>);
  •  операция И (and);
  •  операция ИЛИ (or);
  •  операции цикла (for), квантификаторы (some и every), условная операция (if);
  •  операция запятая (,).

5.1.1.4. Функции XPath и XQuery

Операндами в выражениях XPath могут быть вызовы функций. Определенная в спецификации общая библиотека XPath и XQuery включает набор базовых функций и операторов для преобразования данных.

Общее определение функции в XPath и XQuery имеет следующий вид:

fn:имя-функции($имя-параметра-1 as тип-параметра-1, ...)

as тип-возвращаемого-значения

В описании типа параметра может быть использован тип numeric, что соответствует любому из следующих типов: xs:integer, xs:decimal, xs:float и xs:double.

Для некоторых функций может быть задан только один аргумент или аргумент может отсутствовать. Для обозначения такой ситуации после типа аргумента ставится символ "?":

fn:имя-функции($имя-параметра-1 as тип-параметра-1?)

as тип-возвращаемого-значения

Для некоторых функций может отсутствовать возвращаемое значение. Для обозначения такой ситуации после типа возвращаемого значения ставится символ "?":

fn:имя-функции($имя-параметра-1 as тип-параметра-1, ...)

as тип-возвращаемого-значения?

В некоторых функциях аргумент может отсутствовать или может быть задано оди и более однотипных аргументов. Для обозначения такой ситуации после типа аргумента ставится символ "*":

fn:имя-функции($имя-параметра-1 as тип-параметра-1*)

as тип-возвращаемого-значения

Обращение к функции выполняется следующим образом:

fn:имя-функции($аргумент-1, $аргумент-2,...)

 

В XPath и XQuery определены следующие основные виды функций и операторов:

  •  функции-конструкторы;
  •  числовые функции и операторы;
  •  строковые функции;
  •  булевские функции и операторы;
  •  функции и операторы для продолжительности, дат и времени;
  •  функции для узлов;
  •  функции и операторы для последовательностей;
  •  контекстные функции.

5.1.1.4.1. Функции-конструкторы

Функции-конструкторы имеют следующее общее определение:

префикс:тип($аргумент as xs:anyAtomicType?) as префикс:тип?

В этом определении префикс – это префикс пространства имен, тип – тип данного (встроенный или тип данных, определенный пользователем), аргумент – аргумент при обращении к функции-конструктору.

Для типа данного xs:dateTime функция-конструктор имеет специальный формат:

fn:dateTime($аргумент-1 as xs:date?, $ аргумент-1  as xs:time?)

as xs:dateTime?

Примеры функций-конструкторов:

1. xs:double("121") – преобразует строку в число с плавающей точкой двойной точности и возвращает полученное число.

2. fn:dateTime(xs:date("1999-12-31"), xs:time("12:00:00")) – возвращает дату типа xs:dateTime со значением "1999-12-31T12:00:00".

5.1.1.4.2. Числовые операторы и функции

Числовые операторы выполняют функции, аналогичные знакам арифметических одноместных и двуместных операций:

  •  op:numeric-add – сложение;
  •  op:numeric-subtract – вычитание;
  •  op:numeric-multiply – умножение;
  •  op:numeric-divide – деление;
  •  op:numeric-integer-divide – деление нацело;
  •  op:numeric-mod – взятие по модулю;
  •  op:numeric-unary-plus – унарный плюс;
  •  op:numeric-unary-minus – унарный минус.  

Параметрами и возвращаемыми значениями являются данные типов xs:integer, xs:decimal, xs:float и xs:double (тип numeric), а также производных от них типов. Для последних двух операторов определен один аргумент типа, для остальных операторов – два аргумента типа numeric. Если типы аргументов не совпадают, перед выполнением операции выполняется преобразование к более общему типу.

Примеры числовых операторов:

1. op:numeric-add(12, 5) – возвращает значение 17.

2. op:numeric-divide(12.3, 5) – преобразует второй аргумент в данное типа xs:double и возвращает значение 2.46 типа xs:double.

Операторы сравнения выполняют функции, аналогичные функциям операторов в выражениях сравнения:

  •  op:numeric-equal – сравнение на равенство;
  •  op:numeric-less-than – сравнение на меньше, чем;
  •  op:numeric-greater-than – сравнение на больше, чем.

Эти операторы возвращают true или false в зависимости от результата сравнения.

Примеры операторов сравнения:

1. op:numeric-equal(12, 12.0) – возвращает значение true.

2. op:numeric-less-than(5, 8)возвращает значение false.

В числовые функции XPath входят:

  •  fn:abs($arg as numeric?) as numeric? – возвращает абсолютное значение заданного в аргументе числа;
  •  fn:ceiling($arg as numeric?) as numeric? – возвращает наименьшее целое, которое не меньше, чем заданное в аргументе число;
  •  fn:floor($arg as numeric?) as numeric? – возвращает наибольшее целое, которое не больше, чем заданное в аргументе число;
  •  fn:round($arg as numeric?) as numeric? – возвращает  заданное в аргументе число, округленное до ближайшего целого числа;
  •  fn:round-half-to-even($arg as numeric?, $precision as xs:integer) as numeric? – округляет заданное в первом аргументе число; в сторону ближайшего числа с точностью, заданной во втором аргументе. Если второй аргумент больше 0, то это число показывает точность справа от десятичной точки, иначе – слева. Если последняя отбрасываемая цифра равна 5, выполняется округление до ближайшего четного числа. Если функция задана с одним аргументом, предполагается, что значение второго аргумента равно 0.

Примеры числовых функций:

1. ceiling(3.14)  – возвращает число 4.

2. floor(3.14)  – возвращает число 3.

3. round(3.14)  – возвращает число 3.

4. round-half-to-even(3.145, 2)  – возвращает число 3.14.

5. round-half-to-even(3145, -2)  – возвращает число 3100.

6. round-half-to-even(3.5, 2)  – возвращает число 4.

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

В XPath и XQuery определены следующие типы строковых функций:

  •  функции сборки-разборки строк;
  •  функции сравнения строк;
  •  функции строковых значений;
  •  функции поиска соответствия в строках;
  •  функции с использованием шаблонов регулярных выражений.

5.1.1.4.3.1. Функции сборки-разборки строк

Функция

fn:codepoints-to-string($arg as xs:integer*) as xs:string

создает строку из заданных в десятичных кодов Unicode, а функция

fn:string-to-codepoints($arg as xs:string?) as xs:integer*

выполняет обратное преобразование

Примеры использования функций сборки-разборки строк:

1. fn:codepoints-to-string((1071,1079,1096,1082,32,104,96,

129,116,104)) – преобразует коды символов, заданные в аргументе, в строку "Язык XPath".

2. fn:string-to-codepoints("Язык XPath") – преобразует коды символов, заданные в аргументе, в последовательность (1071,1079,1096,1082,32,

104,96,129,116,104).

5.1.1.4.3.2. Функции сравнения строк

Функция

fn:compare($comparand1 as xs:string?,

$comparand2 as xs:string?) as xs:integer?

сравнивает две строки и возвращает -1, если первая строка меньше второй, 0, если строки равны и 1, если первая строка больше второй.

Функция 

fn:codepoint-equal($comparand1  as xs:string?,

$comparand2  as xs:string?) as xs:boolean?

возвращает true или false в зависимости от того, равны или не равны последовательности  кодов Unicode, составляющие строки $comparand1 и $comparand2.

Примеры использования функций сравнения строк:

1. fn:compare("abc", "acd") – возвращает значение -1.

2. fn:codepoint-equal("abc", "acd") – возвращает значение false.

5.1.1.4.3.3. Функции строковых значений

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

  •  fn:string-length($arg as xs:string?) as xs:integer – возвращает количество символов в строке;
  •  fn:concat($arg1  as xs:anyAtomicType?, $arg2  as xs:anyAtomicType?,  ... ) as xs:string – возвращает строку-конкатенацию всех строк, заданных в качестве аргументов;
  •  fn:string-join($arg1 as xs:string*, $arg2 as xs:string) as xs:string – возвращает строку-конкатенацию всех строк, причем в качестве разделителя между аргументами в строке используется строка, заданная в $arg2;
  •  fn:substring( $sourceString  as xs:string?, $startingLoc  as xs:double, $length  as xs:double) as xs:string – возвращает подстроку строки $sourceString, начиная с индекса $startingLoc длиной $length (если третий аргумент не задан, возвращается подстрока до конца строки). Нумерация индексов в строке начинается с 1;
  •  fn:normalize-space($arg as xs:string?) as xs:string – возвращает нормализованную строку, т.е. строку, в которой удалены все начальные и конечные пробелы, а все пробелы, количество которых внутри строки больше одного, сокращены до одного пробела;
  •  fn:upper-case($arg as xs:string?) as xs:string  – возвращает строку, в которой все строчные буквенные символы заменены заглавными буквами;
  •  fn:lower-case($arg as xs:string?) as xs:string  – возвращает строку, в которой все заглавные буквенные символы заменены строчными буквами;
  •  fn:translate($arg  as xs:string?, $mapString  as xs:string, $transString  as xs:string) as xs:string – заменяет в строке $arg все вхождения символа в i-ой позиции в $mapString символом в i-ой позиции в $transString.

Примеры использования функций для строковых значений:

1. fn:string-length("abc") – возвращает число 3.

2. fn:concat("The"," ", "XML") – возвращает строку  "The XML".

3. fn:string-join("ab","cd","e",":") – возвращает строку  "ab:cd:e".

4. fn:substring("abcdef",3,2) – возвращает строку  "cd".

5. fn:substring("abcdef",3) – возвращает строку  "cdef".

6. fn:normalize-space(" ab  cd ef  ") возвращает строку  

"ab cd ef").

7. fn:upper-case("ABc") возвращает строку  "ABC".

8. fn:lower-case("ABc") возвращает строку  "abc".

9. fn:translate("ABc","Ac","aC") возвращает строку  "aBC".

5.1.1.4.3.4. Функции поиска соответствия в строках

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

  •  fn:contains($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean – возвращает true, если строка $arg1 содержит строку $arg2 и false – в противном случае;
  •  fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean – возвращает true, если строка $arg1 начинается со строки $arg2 и false – в противном случае;
  •  fn:ends-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean – возвращает true, если строка $arg1 заканчивается строкой $arg2 и false – в противном случае;
  •  fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?) as xs:string – возвращает  часть строки $arg1, которая следует перед строкой $arg2, содержащейся в первой строке (если вторая строка не содержится в первой строке, возвращается пустая строка);
  •  fn:substring-after($arg1 as xs:string?, $arg2 as xs:string?) as xs:string – возвращает  часть строки $arg1, которая следует после строки $arg2, содержащейся в первой строке (если вторая строка не содержится в первой строке, возвращается пустая строка).

Примеры использования функций поиска соответствия в строках:

1. fn:contains("abcdef","de") возвращает true.

2. fn:starts-with("abcdef","de") возвращает false.

3. fn:ends-with("abcdef","f") возвращает true.

4. fn:substring-before("12/10","/") возвращает строку  "12".

5. fn:substring-after("12/10","/") – возвращает строку  "10".

5.1.1.4.3.5. Функции с использованием регулярных выражений

В XPath и XQuery определены следующие функции с использованием регулярных выражений:

  •  fn:matches($input as xs:string?, $pattern as xs:string, $flags  as xs:string) as xs:boolean – возвращает true, если в строке $input встречается шаблон, заданному в строке $pattern, иначе возвращает false (необязательный параметр $flags содержит символы-флажки, задающие условия применения шаблона);
  •  fn:replace($input  as xs:string?, $pattern  as xs:string, $replacement  as xs:string, $flags  as xs:string) as xs:string – возвращает строку, которая получается при замене в строке $input соответствий шаблону, заданному в строке $pattern, строкой, заданной в параметре $replacement (необязательный параметр $flags содержит символы-флажки, задающие условия применения шаблона);
  •  fn:tokenize($input  as xs:string?, $pattern  as xs:string, $flags  as xs:string) as xs:string* – возвращает последовательность строк, полученную разбиением исходной строки $input по разделительным подстрокам, заданным в шаблоне $pattern (необязательный параметр $flags содержит символы-флажки, задающие условия применения шаблона).
  •  Параметр $flags в приведенных функциях может содержать следующие флажки:
  •  s – метасимвол "." соответствует любому символу строки (если флажок s не задан, метасимвол "." соответствует любому символу строки, за исключением символа перехода на новую строку);
  •  m – исходная строка рассматривается как строка, состоящая из нескольких строк, если она содержит символы перехода на новую строку (если флажок m не задан, строка рассматривается как одна строка при использовании метасимволов поиска в начале строки "^" и в конце строки "$");
  •  i – поиск по шаблону не зависит от регистра букв (заглавные и строчные буквы считаются одинаковыми);
  •  x – пробельные символы перед поиском соответствия шаблону удаляются из строки, если они не заданы в шаблоне как класс символов (например, "\s").

Примеры использования регулярных выражений:

1. fn:matches("abcdef","de") – возвращает true.

2. fn:matches("abcdef","DE") возвращает false.

3. fn:matches("abcdef","DE","i") возвращает true.

4. fn:matches("AB CD","BC") возвращает false.

5. fn:matches("AB CD","bc","ix") возвращает true.

6. fn:matches("AB CD","b\sc","ix") возвращает true.

7. fn:matches("AB

CD","B.*C") возвращает false.

8. fn:matches("AB

CD","B.*C","s") возвращает true.

9. fn:matches("AB

CD","^C") возвращает false.

10. fn:matches("AB

CD","^C","m") – возвращает true.

11. fn:replace("aabcdaefaad","aa","a") – возвращает строку "abcdaefad".

12. fn:tokenize("a:b cd:f","(:| )") – возвращает строки  "a", "b", "cd"  и "f".

5.1.1.4.4. Булевские функции и операторы

Две функции-конструкторы

fn:true() as xs:boolean

и

fn:false() as xs:boolean

возвращают соответственно значения true и false.

Для булевских данных определены следующие операторы:

  •  op:boolean-equal($value1 as xs:boolean, $value2 as xs:boolean) as xs:boolean – возвращает true в случае, если оба аргумента равны true или оба аргумента равны false, в противном случае возвращает false;
  •  op:boolean-less-than($arg1 as xs:boolean, $arg2 as xs:boolean) as xs:boolean – возвращает true в случае, если первый аргумент равен false, а второй – true, в противном случае возвращает false;
  •  op:boolean-greater-than($arg1 as xs:boolean, $arg2 as xs:boolean) as xs:boolean – возвращает true в случае, если первый аргумент равен true, а второй – false, в противном случае возвращает false;

Функция

fn:not($arg as item()*) as xs:boolean

возвращает false в случае, если первый аргумент приводится к булевскому значению true, в противном случае возвращает true.

Примеры использования булевских функций и операторов:

1. fn:true() возвращает true.

2. op:boolean-equal(true, false) возвращает false.

3. op:boolean-less-than(true, false) возвращает false.

4. op:boolean-greater-than(true, false) возвращает true.

5. fn:not(false) возвращает true.

6. fn:not(3<5) – возвращает false.

5.1.1.4.5. Функции и операторы для продолжительности, дат и времени

Функции и операторы дат и времени определены для следующих типов данных: s:dateTime, xs:date, xs:time, xs:gYearMonth, xs:gYear, xs:gMonthDay, xs:gMonth и xs:gDay, а функции продолжительности определены для типов данных xs:duration, xs:yearMonthDuration и xs:dayTimeDuration.

Для типов данных xs:gYearMonth, xs:gYear, xs:gMonthDay, xs:gMonth и xs:gDay, а также типа данных xs:duration определены только сравнения на равенство и неравенство.

Для продолжительности, дат и времени определены следующие группы операторов и функций:

  •  операторы сравнения;
  •  функции извлечения компонент;
  •  арифметические операторы для продолжительности, дат и времени.

5.1.1.4.5.1. Операторы сравнения

В XPath и XQuery для продолжительности, дат и времени определены следующие операторы сравнения:

  •  op:yearMonthDuration-less-than($arg1  as xs:yearMonthDuration, $arg2  as xs:yearMonthDuration) as xs:Boolean – возвращает true только в том случае, если $arg1 меньше $arg2, в противном случае возвращает false;
  •  op:yearMonthDuration-greater-than($arg1  as xs:yearMonthDuration, $arg2  as xs:yearMonthDuration) as xs:boolean – возвращает true только в том случае, если $arg1 больше $arg2, в противном случае возвращает false;
  •  op:dayTimeDuration-less-than($arg1  as xs:dayTimeDuration, $arg2  as xs:dayTimeDuration) as xs:boolean – возвращает true только в том случае, если $arg1 меньше $arg2, в противном случае возвращает false;
  •  op:dayTimeDuration-greater-than($arg1  as xs:dayTimeDuration, $arg2  as xs:dayTimeDuration) as xs:boolean – возвращает true только в том случае, если $arg1 больше $arg2, в противном случае возвращает false;
  •  op:duration-equal($arg1 as xs:duration, $arg2 as xs:duration) as xs:boolean – возвращает true только в том случае, если компоненты xs:yearMonthDuration и xs:dayTimeDuration в $arg1 и $arg2 равны друг другу, в противном случае возвращает false;
  •  op:dateTime-equal($arg1 as xs:dateTime, $arg2 as xs:dateTime) as xs:boolean – возвращает true только в том случае, если $arg1 и $arg2 равны друг другу, в противном случае возвращает false;
  •  op:dateTime-less-than($arg1 as xs:dateTime, $arg2 as xs:dateTime) as xs:boolean – возвращает true только в том случае, если $arg1 меньше $arg2, в противном случае возвращает false;
  •  op:dateTime-greater-than( $arg1  as xs:dateTime, $arg2  as xs:dateTime) as s:boolean – возвращает true только в том случае, если $arg1 больше $arg2, в противном случае возвращает false;
  •  op:date-equal($arg1 as xs:date, $arg2 as xs:date) as xs:boolean – возвращает true только в том случае, если $arg1 равен $arg2, в противном случае возвращает false;
  •  op:date-less-than($arg1 as xs:date, $arg2 as xs:date) as xs:boolean – возвращает true только в том случае, если $arg1 меньше $arg2, в противном случае возвращает false;
  •  op:date-greater-than($arg1 as xs:date, $arg2 as xs:date) as xs:boolean – возвращает true только в том случае, если $arg1 больше $arg2, в противном случае возвращает false;
  •  op:time-equal($arg1 as xs:time, $arg2 as xs:time) as xs:boolean – возвращает true только в том случае, если $arg1 и $arg2, преобразованные к типу xs:dateTime, равны друг другу, в противном случае возвращает false;
  •  op:time-less-than($arg1 as xs:time, $arg2 as xs:time) as xs:boolean  – возвращает true только в том случае, если для $arg1 и $arg2, преобразованных к типу xs:dateTime, выполняется отношение $arg1 меньше $arg2, в противном случае возвращает false;
  •  op:time-greater-than($arg1 as xs:time, $arg2 as xs:time) as xs:boolean – возвращает true только в том случае, если для $arg1 и $arg2, преобразованных к типу xs:dateTime, выполняется отношение $arg1 больше $arg2, в противном случае возвращает false;
  •  op:gYearMonth-equal($arg1  as xs:gYearMonth, $arg2  as xs:gYearMonth) as xs:boolean – возвращает true только в том случае, если $arg1 и $arg2, преобразованные к типу xs:dateTime, равны друг другу, в противном случае возвращает false;
  •  op:gYear-equal($arg1 as xs:gYear, $arg2 as xs:gYear) as xs:boolean – возвращает true только в том случае, если $arg1 и $arg2, преобразованные к типу xs:dateTime, равны друг другу, в противном случае возвращает false;
  •  op:gMonth-equal($arg1 as xs:gMonth, $arg2 as xs:gMonth) as xs:boolean – возвращает true только в том случае, если $arg1 и $arg2, преобразованные к типу xs:dateTime, равны друг другу, в противном случае возвращает false;
  •  op:gDay-equal($arg1 as xs:gDay, $arg2 as xs:gDay) as xs:boolean – возвращает true только в том случае, если $arg1 и $arg2, преобразованные к типу xs:dateTime, равны друг другу, в противном случае возвращает false.

Примеры использования операторов сравнения для продолжительности, дат и времени:

1. op:yearMonthDuration-less-than (xs:yearMonthDuration("P2Y"), xs:yearMonthDuration("P1Y11M")) возвращает true.

2. op:dayTimeDuration-greater-than(xs:dayTimeDuration ("PT10D"), xs:dayTimeDuration ("PT10D11H")) возвращает false.

3. op:duration-equal(xs:duration("PT10D"), xs:duration("PT9D24H")) возвращает true.

4. op:dateTime-less-than(xs:dateTime("2002-05-12T00:00:00"),  

xs:dateTime("2002-05-12T12:00:00")) возвращает true.

5. op:date-equal(xs:date("2007-12-30"),

xs:date("2007-12-29")) – возвращает false.

6. op:time-less-than(xs:time("10:15:00"),

xs:time("12:00:40")) возвращает true.

7. op:gYearMonth-equal(xs:gYearMonth("2005-09"),

xs:gYearMonth("2005-09")) возвращает true.

8. op:gYear-equal(gYear("2005"),

gYear("2004")) возвращает false.

9. op:gMonth-equal(xs:gMonth("-12-"),

Xs:gMonth("-09-")) возвращает false.

10. op:gDay-equal(xs:gDay("-15"),

xs:gDay("-15")) – возвращает true.

5.1.1.4.5.2. Функции извлечения компонент

В XPath и XQuery для извлечения компонент из данных продолжительности, дат и времени определены следующие функции:

  •  fn:years-from-duration($arg as xs:duration?) as xs:integer? – возвращает количество лет в продолжительности;
  •  fn:months-from-duration($arg as xs:duration?) as xs:integer? – возвращает количество месяцев в продолжительности;
  •  fn:days-from-duration($arg as xs:duration?) as xs:integer?  – возвращает количество дней в продолжительности;
  •  fn:hours-from-duration($arg as xs:duration?) as xs:integer? – возвращает количество часов в продолжительности;
  •  fn:minutes-from-duration($arg as xs:duration?) as xs:integer? 
  •  fn:seconds-from-duration($arg as xs:duration?) as xs:decimal? – возвращает количество минут в продолжительности;
  •  fn:year-from-dateTime($arg as xs:dateTime?) as xs:integer? – возвращает значение года в дате и времени;
  •  fn:month-from-dateTime($arg as xs:dateTime?) as xs:integer? – возвращает значение индекса месяца в дате и времени;
  •  fn:day-from-dateTime($arg as xs:dateTime?) as xs:integer? – возвращает значение дня месяца в дате и времени;
  •  fn:hours-from-dateTime($arg as xs:dateTime?) as xs:integer? – возвращает значение количества часов в дате и времени;
  •  fn:minutes-from-dateTime($arg as xs:dateTime?) as xs:integer? – возвращает значение количества минут в дате и времени;
  •  fn:seconds-from-dateTime($arg as xs:dateTime?) as xs:decimal? – возвращает значение количества секунд в дате и времени;
  •  fn:timezone-from-dateTime($arg as xs:dateTime?) as xs:dayTimeDuration? – возвращает значение смещения временной зоны в дате и времени;
  •  fn:year-from-date($arg as xs:date?) as xs:integer?  – возвращает значение года в дате;
  •  fn:month-from-date($arg as xs:date?) as xs:integer? – возвращает значение индекса месяца в дате;
  •  fn:day-from-date($arg as xs:date?) as xs:integer?  – возвращает значение дня месяца в дате;
  •  fn:timezone-from-date($arg as xs:date?) as xs:dayTimeDuration?  – возвращает значение для временной зоны в дате;
  •  fn:hours-from-time($arg as xs:time?) as xs:integer?  – возвращает значение часов для времени;
  •  fn:minutes-from-time($arg as xs:time?) as xs:integer? – возвращает значение минут для времени;
  •  fn:seconds-from-time($arg as xs:time?) as xs:decimal? – возвращает значение секунд для времени;
  •  fn:timezone-from-time($arg as xs:time?) as xs:dayTimeDuration? – возвращает значение временной зоны для времени.

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

1. fn:years-from-duration(xs:yearMonthDuration("P20Y10M"))

возвращает 20.

2. fn:months-from-duration(xs:yearMonthDuration("P20Y10M"))

возвращает 10.

3. fn:days-from-duration(

xs:dayTimeDuration("P12DT11H15M30S"))  возвращает 12.

4. fn:hours-from-duration(

xs:dayTimeDuration("P12DT10H15M30S"))  – возвращает 11.

5. fn:minutes-from-duration(

xs:dayTimeDuration("P12DT10H15M30S"))  – возвращает 15.

6. fn:seconds-from-duration(

xs:dayTimeDuration("P12DT10H15M30S"))  возвращает 30.

7. fn:year-from-dateTime(

xs:dateTime("2007-11-18T13:20:00+02:00")) возвращает 2007.

8. fn:minutes-from-dateTime(

xs:dateTime("2007-11-18T13:20:00+02:00")) возвращает 20. 

9. fn:timezone-from-dateTime(

xs:dateTime("2007-11-18T13:20:00+02:00")) возвращает PT2H. 

10. fn:year-from-date(xs:date("2006-01-01")) возвращает 2006.

11. fn:day-from-date(xs:date("2006-01-01")) возвращает 1.

12. fn:timezone-from-date(xs:date("2006-01-01-02:00")) возвращает -PT2H.

13. fn:hours-from-time(xs:time("02:00:12")) возвращает 2.

14. fn:seconds-from-time(xs:time("02:00:12")) возвращает 12.

15. fn:timezone-from-time(xs:time("02:00:12+02:00")) возвращает PT2H.

5.1.1.4.5.3. Арифметические операторы для продолжительности, дат и времени

В XPath и XQuery для выполнения арифметических действий над данными продолжительности определены следующие операторы:

  •  op:add-yearMonthDurations($arg1  as xs:yearMonthDuration, $arg2  as xs:yearMonthDuration) as xs:yearMonthDuration – возвращает результат сложения $arg1 и $arg2;
  •  op:subtract-yearMonthDurations($arg1 as xs:yearMonthDuration, $arg2  as xs:yearMonthDuration) as xs:yearMonthDuration 
  •  op:multiply-yearMonthDuration($arg1 as xs:yearMonthDuration, $arg2  as xs:double) as xs:yearMonthDuration – возвращает результат умножения $arg1 на $arg2;
  •  op:divide-yearMonthDuration($arg1 as xs:yearMonthDuration, $arg2  as xs:double) as xs:yearMonthDuration 
  •  op:divide-yearMonthDuration-by-yearMonthDuration($arg1  as xs:yearMonthDuration, $arg2  as xs:yearMonthDuration) as xs:decimal – возвращает результат деления $arg1 на $arg2;
  •  op:add-dayTimeDurations($arg1  as xs:dayTimeDuration, $arg2  as xs:dayTimeDuration) as xs:dayTimeDuration – возвращает результат сложения $arg1 и $arg2;
  •  op:subtract-dayTimeDurations($arg1  as xs:dayTimeDuration, $arg2  as xs:dayTimeDuration) as xs:dayTimeDuration – возвращает результат вычитания $arg1 и $arg2;
  •  op:multiply-dayTimeDuration( $arg1  as xs:dayTimeDuration, $arg2  as xs:double) as xs:dayTimeDuration – возвращает результат умножения $arg1 на $arg2;
  •  op:divide-dayTimeDuration( $arg1  as xs:dayTimeDuration, $arg2  as xs:double) as s:dayTimeDuration – возвращает результат деления $arg1 на $arg2;
  •  op:divide-dayTimeDuration-by-dayTimeDuration( $arg1  as xs:dayTimeDuration, $arg2  as xs:dayTimeDuration) as xs:decimal – возвращает результат деления $arg1 на $arg2.

Примеры использования арифметических операторов для продолжительности:

1. op:add-yearMonthDurations(xs:yearMonthDuration("P1Y11M"), xs:yearMonthDuration("P4Y2M")) –  возвращает P6Y1M.

2. op:subtract-yearMonthDurations(xs:yearMonthDuration("P3Y11M"), xs:yearMonthDuration("P3Y3M"))возвращает P0Y8M.

3. op:multiply-yearMonthDuration(

xs:yearMonthDuration("P1Y10M"), 2)  возвращает P3Y8M.

4. op:divide-yearMonthDuration(

xs:yearMonthDuration("P2Y10M"), 2)  возвращает P1Y5M.

5. op:divide-yearMonthDuration-by-yearMonthDuration(

xs:yearMonthDuration("P3Y4M"),

xs:yearMonthDuration("-P1Y4M")) возвращает -2.5.

6. op:add-dayTimeDurations(

xs:dayTimeDuration("P1DT12H5M"),

xs:dayTimeDuration("P7DT12H"))  возвращает P9DT00H5M.

7. op:subtract-dayTimeDurations(

xs:dayTimeDuration("P3DT12H"),

xs:dayTimeDuration("P1DT09H30M"))  возвращает P2D02H30M.

8. op:multiply-dayTimeDuration(

xs:dayTimeDuration("PT3H17M"), 2) возвращает PT6H34M. 

9. op:divide-dayTimeDuration(

xs:yearMonthDuration("P2DT3H30M"), 2) возвращает P1DT1H45M. 

10. op:divide-dayTimeDuration-by-dayTimeDuration(

xs:dayTimeDuration("P2DT53M11S"),

xs:dayTimeDuration("P1DT10H))  возвращает 1.4378349.

Кроме приведенных выше операторов в XPath и XQuery для выполнения арифметических действий над данными продолжительности, дат и времени определены следующие операторы:

  •  op:subtract-dateTimes($arg1  as xs:dateTime, $arg2  as xs:dateTime) as xs:dayTimeDuration? – возвращает разницу между нормализованными значениями $arg1 и $arg2;
  •  op:subtract-dates($arg1 as xs:date, $arg2 as xs:date) as xs:dayTimeDuration? – возвращает разницу между значениями $arg1 и $arg2;
  •  op:subtract-times($arg1 as xs:time, $arg2 as xs:time) as xs:dayTimeDuration – возвращает разницу между преобразованными в xs:dateTime значениями $arg1 и $arg2;
  •  op:add-yearMonthDuration-to-dateTime($arg1  as xs:dateTime, $arg2  as xs:yearMonthDuration) as xs:dateTime – возвращает сумму значений $arg1 и $arg2;
  •  op:add-dayTimeDuration-to-dateTime($arg1  as xs:dateTime, $arg2  as xs:dayTimeDuration) as xs:dateTime – возвращает сумму значений $arg1 и $arg2;
  •  op:subtract-yearMonthDuration-from-dateTime($arg1  as xs:dateTime, $arg2  as xs:yearMonthDuration) as xs:dateTime – возвращает разницу значений $arg1 и $arg2;
  •  op:subtract-dayTimeDuration-from-dateTime($arg1  as xs:dateTime, $arg2  as xs:dayTimeDuration) as xs:dateTime – возвращает разницу значений $arg1 и $arg2;
  •  op:add-yearMonthDuration-to-date($arg1  as xs:date, $arg2  as xs:yearMonthDuration) as xs:date – возвращает сумму значений $arg1 и $arg2;
  •  op:add-dayTimeDuration-to-date( $arg1  as xs:date, $arg2  as xs:dayTimeDuration) as xs:date – возвращает сумму значений $arg1 и $arg2;
  •  op:subtract-yearMonthDuration-from-date($arg1  as xs:date, $arg2  as xs:yearMonthDuration) as xs:date – возвращает разницу значений $arg1 и $arg2;
  •  op:subtract-dayTimeDuration-from-date($arg1  as xs:date, $arg2  as xs:dayTimeDuration) as xs:date – возвращает разницу значений $arg1 и $arg2;
  •  op:add-dayTimeDuration-to-time( $arg1  as xs:time, $arg2  as xs:dayTimeDuration) as xs:time – возвращает сумму значений $arg1 и $arg2;
  •  op:subtract-dayTimeDuration-from-time( $arg1  as xs:time, $arg2  as xs:dayTimeDuration) as xs:time – возвращает разницу значений $arg1 и $arg2.

Примеры использования арифметических операторов для продолжительности, дат и времени:

1. op:subtract-dateTimes(xs:dateTime("2001-10-30T06:12:00"), xs:dateTime("2000-11-28T09:00:00Z")) –  возвращает P0Y0M337T2H12M.

2. op:subtract-dates(xs:date("2000-09-15-05:00"), xs:date("2000-09-11+02:00")) возвращает P4DT7H.

3. op:subtract-times(xs:time("11:12:00Z"), xs:time("04:00:00")) возвращает PT2H12M.

4. op:add-yearMonthDuration-to-dateTime(

xs:dateTime("2000-10-30T11:12:00"),

xs:yearMonthDuration("P1Y2M")) возвращает 

"2001-12-30T11:12:00".

5. op:add-dayTimeDuration-to-dateTime(

xs:dateTime("2000-10-30T11:12:00"),

xs:dayTimeDuration("P3DT1H15M")) возвращает 

"2000-11-02T12:27:00".

6. op:subtract-yearMonthDuration-from-dateTime(

xs:dateTime("2000-10-30T11:12:00"),

xs:yearMonthDuration("P1Y2M")) возвращает 

"1999-08-30T11:12:00".

7. op:subtract-dayTimeDuration-from-dateTime(

xs:dateTime("2000-10-30T11:12:00"),

xs:dayTimeDuration("P3DT1H15M")) возвращает 

"2000-10-27T09:57:00".

8. op:add-yearMonthDuration-to-date(

xs:date("2000-10-30"),

xs:yearMonthDuration("P1Y2M")) возвращает "2001-12-30". 

9. op:add-dayTimeDuration-to-date(

xs:date("2004-10-30Z"),

xs:dayTimeDuration("P2DT2H30M0S")) возвращает "2004-11-01". 

10. op:subtract-yearMonthDuration-from-date(

xs:date("2000-10-30"),

xs:yearMonthDuration("P1Y2M")) возвращает "1999-08-30".

11. op:subtract-dayTimeDuration-from-date(

xs:date("2000-10-30"),

xs:dayTimeDuration("P3DT1H15M")) возвращает "2000-10-26".

12. op:add-dayTimeDuration-to-time(

xs:time("11:12:00"),

xs:dayTimeDuration("P3DT1H15M")) возвращает "12:27:00".

13. op:subtract-dayTimeDuration-from-time(

xs:time("11:12:00"),

xs:dayTimeDuration("P3DT1H15M")) возвращает "09:57:00".

5.1.1.4.6. Функции для узлов

В XPath и XQuery для узлов определены следующие функции:

  •  fn:name($arg as node()?) as xs:string – возвращает имя узла (если аргумент не задан, возвращает имя текущего узла);
  •  fn:local-name($arg as node()?) as xs:string – возвращает локальное имя узла (если аргумент не задан, возвращает локальное имя текущего узла);
  •  fn:namespace-uri($arg as node()?) as xs:anyURI –пространство имен  URI для узла (если аргумент не задан, возвращает пространство имен  URI текущего узла);
  •  fn:number($arg as xs:anyAtomicType?) as xs:double – возвращает значение $arg, преобразованное к числу с плавающей точкой или, если $arg не задан, значение текущего узла, преобразованное к числу с плавающей точкой;
  •  fn:lang($testlang as xs:string?, $node as node()) as xs:boolean – возвращает true, если значение атрибута xml:lang для узла $node (или, если аргумент $node не задан, для текущего узла) равно языку, указанному в первом аргументе, в противном случае возвращается false;
  •  op:is-same-node($parameter1 as node(), $parameter2 as node()) as xs:boolean – возвращает true, если узел, заданный в аргументе $parameter1, является тем же узлом, что и узел, заданный в аргументе $parameter2, в противном случае возвращается false;
  •  op:node-before($parameter1 as node(), $parameter2 as node()) as xs:boolean  – возвращает true, если узел, заданный в аргументе $parameter1, предшествует узлу, заданному в аргументе $parameter2, в противном случае возвращается false;
  •  op:node-after($parameter1 as node(), $parameter2 as node()) as xs:boolean  – возвращает true, если узел, заданный в аргументе $parameter1, следует за узлом, заданным в аргументе $parameter2, в противном случае возвращается false;
  •  fn:root($arg as node()?) as node()? – возвращает корень дерева, к которому принадлежит узел (если аргумент не задан, возвращается корень дерева для текущего узла).

Примеры использования функций для узлов:

1. fn:name($node1) –  возвращает имя узла, заданного в переменной  $node1.

2. fn:local-name($node1) – возвращает локальное имя узла, заданного в переменной  $node1.

3. fn:namespace-uri($node1) – возвращает пространство имен для имени узла, заданного в переменной  $node1.

4. fn:number(xs:string("24")) возвращает 2.4E1.

5. fn:lang(xs:string("en"), $node1) возвращает true, если для узла $node1 задан атрибут xml:lang и его значение равно "en".

6. op:is-same-node($node1, $node2)возвращает false.

7. op:node-before($node1, $node2) – возвращает true, если узел $node1 предшествует узлу $node2.

8. op:node-after($node1, $node2) – возвращает false, если узел $node1 предшествует узлу $node2.

9. fn:root($node1) – возвращает корневой узел узла  $node1. 

5.1.1.4.7. Функции и операторы для последовательностей

В XPath и XQuery для последовательностей определены следующие группы функций и операторов:

  •  общие функции и операторы;
  •  функции проверки количества элементов в последовательности;
  •  функции и операторы для операций с множествами;
  •  агрегатные функции;
  •  функции, генерирующие последовательности.

5.1.1.4.7.1. Общие функции и операторы

В XPath и XQuery для последовательностей определены следующие общие функции и операторы:

  •  op:concatenate($seq1 as item()*, $seq2 as item()*) as item()* – сцепляет  последовательности, заданные в аргументах в одну последовательность;
  •  fn:index-of($seqParam  as xs:anyAtomicType*, $srchParam  as xs:anyAtomicType) as xs:integer* – возвращает последовательность индексов тех элементов последовательности $seqParam, которые равны $srchParam;  
  •  fn:empty($arg as item()*) as xs:boolean – возвращает true, если – пустая последовательность или false – в противном случае;
  •  fn:exists($arg as item()*) as xs:boolean – возвращает true, если – не пустая последовательность или false – в противном случае;
  •  fn:distinct-values($arg as xs:anyAtomicType*) as xs:anyAtomicType* – возвращает последовательность, в которых все повторяющиеся элементы, за исключением одного, удалены;
  •  fn:insert-before($target  as item()*, $position  as xs:integer, $inserts  as item()*) as item()* – возвращает последовательность, в которой в исходную последовательность $target вставлена, начиная с индекса $position, последовательность, заданная в $inserts;
  •  fn:remove($target as item()*, $position as xs:integer) as item()* – возвращает последовательность, в которой из исходной последовательности $target удален элемент с индексом $position;
  •  fn:reverse($arg as item()*) as item()* – возвращает последовательность, в которой элементы последовательности $arg переставлены в обратном порядке;
  •  fn:subsequence($sourceSeq  as item()*, $startingLoc  as xs:double, $length  as xs:double) as item()* – возвращает последовательность, которая является подстрокой последовательности $sourceSeq, начиная с индекса $startingLoc длиной $length (если аргумент $length не задан, подстрока выделяется до конца строки);
  •  fn:unordered($sourceSeq as item()*) as item()*  – возвращает последовательность, в которой элементы последовательности $sourceSeq переставлены в случайном порядке.

Примеры использования общих функций и операторов последовательностей:

1. op:concatenate((1,4,8), (3,4,7)) возвращает последовательность (1,4,8,3,4,7).

2. fn:index-of((1,4,8,3,4,7))  возвращает последовательность индексов (2,5).

3. fn:empty((2,5)) – возвращает false.

4. fn:exists(()) возвращает false.

5. fn:distinct-values((1,4,8,3,4,7)) возвращает (1,4,8,3,7).

6. fn:insert-before((1,4,8,3,7),1,0) возвращает (0,1,4,8,3,7).

7. fn:remove((0,1,4,8,3,7),2) –  возвращает (0,4,8,3,7).

8. fn:reverse((0,4,8,3,7))возвращает (7,3,8,4,0).

9. fn:subsequence((0,4,8,3,7),2,3)возвращает (4,8,3).

10. fn:subsequence((0,4,8,3,7),2)возвращает (4,8,3,7).

11. fn:unordered ((0,4,8,3,7))возвращает (3,0,7,8,4).

5.1.1.4.7.2. Функции проверки количества элементов в последовательности

В XPath и XQuery для последовательностей определены следующие функции проверки количества элементов в последовательности:

  •  fn:zero-or-one($arg as item()*) as item()? – возвращает $arg, если он не содержит элементов или содержит один элемент, в противном случае выдается ошибка;
  •  fn:one-or-more($arg as item()*) as item()+ – возвращает $arg, если он не содержит один и более элементов, в противном случае выдается ошибка;
  •  fn:exactly-one($arg as item()*) as item() – возвращает $arg, если он содержит один элемент, в противном случае выдается ошибка.

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

1. fn:zero-or-one((1)) возвращает последовательность (1).

2. fn:one-or-more((1,4,8,3,4,7))  возвращает последовательность (1,4,8,3,4,7).

3. fn:exactly-one((2,5)) – выдает сообщение об ошибке.

5.1.1.4.7.3. Функции и операторы для операций с множествами

В XPath и XQuery для последовательностей определены следующие функции и операторы для операций с множествами:

  •  fn:deep-equal($parameter1 as item()*, $parameter2 as item()*) as xs:boolean – возвращает true, если и полностью совпадают друг с другом, иначе возвращается false;
  •  op:union($parameter1 as node()*, $parameter2 as node()*) as node()* – возвращает последовательность, являющуюся объединением последовательностей $parameter1 и $parameter2;
  •  op:intersect($parameter1 as node()*, $parameter2 as node()*) as node()* – возвращает последовательность, являющуюся пересечением последовательностей $parameter1 и $parameter2;
  •  op:except($parameter1 as node()*, $parameter2 as node()*) as node()* – возвращает последовательность, являющуюся пересечением последовательностей $parameter1 и $parameter2.

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

1. fn:deep-equal((1,4,8), (1,4,7)) возвращает false.

2. op:union((1,4,8), (1,4,7))  возвращает последовательность (1,4,8,7).

3. op:intersect((1,4,8), (1,4,7)) – возвращает последовательность (1,4).

4. op:except((1,4,8), (1,4,7)) – возвращает (8).

5.1.1.4.7.4. Агрегатные функции

В XPath и XQuery для последовательностей определены следующие агрегатные функции:

  •  fn:count($arg as item()*) as xs:integer – возвращает количество элементов в последовательности $arg;
  •  fn:avg($arg as xs:anyAtomicType*) as xs:anyAtomicType? – возвращает среднее значение для элементов в последовательности $arg;
  •  fn:max($arg as xs:anyAtomicType*) as xs:anyAtomicType? – возвращает максимальное значение элемента в последовательности $arg;
  •  fn:min($arg as xs:anyAtomicType*) as xs:anyAtomicType? – возвращает минимальное значение элемента в последовательности $arg;
  •  fn:sum($arg  as xs:anyAtomicType*, $zero  as xs:anyAtomicType?) as xs:anyAtomicType? – возвращает значение суммы элементов в последовательности $arg (если аргумент задан, он возвращается в качестве значения суммы для пустой последовательности, иначе возвращается целое число 0);

Примеры использования агрегатных функций:

1. fn:count((1,4,8,2)) возвращает число 4.

2. fn:avg((1,4,8,2))  возвращает число 3.75.

3. fn:max((1,4,8,2)) – возвращает число 8.

4. fn:min((1,4,8,2)) – возвращает число 1.

5. fn:sum((1,4,8,2)) – возвращает число 15.

5.1.1.4.7.5. Функции, генерирующие последовательности

В XPath и XQuery определены следующие функции, генерирующие последовательности:

  •  op:to($firstval as xs:integer, $lastval as xs:integer) as xs:integer* – возвращает последовательность целых чисел от  $firstval до $lastval;
  •  fn:id($arg as xs:string*, $node as  node()) as element()* – возвращает последовательность узлов элементов, заданных в $node, которые имеют значение атрибута типа ID, соответствующее значению или значениям типа IDREF, заданным в $arg (если аргумент $node не задан, поиск выполняется в текущем узле);
  •  fn:idref($arg as xs:string*, $node as  node()) as node()*  – возвращает последовательность узлов элементов, заданных в $node, которые имеют ссылки типа IDREF, на узлы,  значение или значения атрибута типа ID для которых задано в $arg (если аргумент $node не задан, поиск выполняется в текущем узле);
  •  fn:doc($uri as xs:string?) as document-node()? – возвращает документ, фрагмент URI которого содержится в аргументе $uri;
  •  fn:doc-available($uri as xs:string?) as xs:boolean – возвращает true, если fn:doc($uri) возвращает документ, иначе возвращает false;
  •  fn:collection($arg as xs:string?) as node()* – возвращает последовательность узлов, полученных по адресу $arg, который рассматривается как данное типа xs:anyURI.  

Примеры использования функций, генерирующих последовательности:

1. op:to(1,4)) возвращает последовательность (1,2,3,4).

2. fn:id(($idref1,$idref2), $node1)  возвращает последовательность узлов элементов, заданных в $node1, которые имеют значение атрибута типа ID, соответствующее значениям типа IDREF,  заданным в первом аргументе.

3. fn:idref(($id1,$id2), $node1)  возвращает последовательность узлов элементов, заданных в $node1, которые имеют ссылки типа IDREF, на узлы,  ID которых задано в первом аргументе.

4. fn:doc(xs:string("mydoc")) – возвращает документ, фрагмент URI которого содержится в аргументе.

5.1.1.4.8. Контекстные функции

Обработка выражений осуществляется в зависимости от некоторого контекста.  Контекст показывает, какой узел в данный момент обрабатывается преобразованием, какова позиция этого узла в обрабатываемом множестве, сколько всего узлов в этом множестве, какие переменные доступны и какие значения они имеют, какие функции могут быть вызваны и, наконец, какие пространства имен объявлены.

В соответствии  со спецификацией XPath, контекст составляют следующие части:

  •  Контекстный узел (context node) – узел, который обрабатывается в текущий момент;
  •  Целое положительное число, показывающее размер контекста – количество   узлов во множестве, которое обрабатывается в данный момент;
  •  Целое положительное число, показывающее позицию контекстного узла в контексте вычисления выражения, то есть порядковый номер узла в текущем множестве преобразования, которое было соответствующим образом упорядочено;
  •  Множество связанных переменных (variable bindings), являющееся  множеством пар вида «имя-значение», в котором имя переменной связывается со значением, присвоенным ей;
  •  Библиотека функций, состоящая из множества функций, которые могут быть выполнены процессором (функции описанной выше базовой библиотеки должны быть реализованы в процессоре, однако эта библиотека может быть расширена);
  •  Множество объявлений пространств имен, связывающее  префиксы пространств имен с уникальными идентификаторами ресурсов (URI), которые им соответствуют.

В XPath и XQuery определены следующие основные контекстные функции:

  •  fn:position() as xs:integer – возвращает позицию текущего узла;
  •  fn:last() as xs:integer – возвращает последний узел в текущей последовательности текущего узла;
  •  fn:current-dateTime() as xs:dateTimeвозвращает текущую дату и время;
  •  fn:current-date() as xs:date – возвращает текущую дату;
  •  fn:implicit-timezone() as xs:dayTimeDuration – возвращает временную зону по умолчанию.

5.1.1.5. Пути адресации в XPath

5.1.1.5.1. Синтаксис путей адресации

Одна из важнейших функций XPath – это выбор множеств узлов в документе. Особый вид выражений XPath, называемый путями адресации (location path), позволяет выбирать в документе множество узлов в соответствии с самыми разнообразными критериями.  

Синтаксис путей выборки во многом похож на синтаксис путей в файловых системах, поскольку  иерархическая структура данных в документах XML очень близка к древовидной структуре каталогов.

Следующий документ XML содержит два сообщения электронной почты:  

<?xml version="1.0" encoding="Windows-1251"?>

<message>

<!--Сообщение e-mail -->

<header>

<from address="ivanov@mail.com"/>

<to address="petrov@mail.com"/>

 <subject>Поздравление</subject>

</header>

<body>Поздравляю с днем рождения!</body>

<header>

<from address="ivanov@mail.com"/>

<to address="sidorov@mail.com"/>

<subject>Напоминание</subject>

</header>

<body>Встречаемся в 10.00.</body>

</message>

На рисунке представлено дерево XPath для этого документа:

Для определения узлов в документе XML XPath использует выражения с шаблонами. Шаблон  XPath – это разделенный символами "/" список имен дочерних элементов, которые описывают путь в документе XML. При обработке шаблона эти элементы, называемые шагами адресации выбираются по одному элементу слева направо.  

Путь адресации может быть абсолютным или относительным.

Абсолютный путь начинается с символа "/", а относительный не содержит в начале символа "/", например, следующий путь в документе message.xml:

/message/header/subject/

выбирает все элементы subject всех элементов header элемента message, а путь

from/address

выбирает атрибут address для заданного элемента from.

Для выбора всех элементов на шаге адресации используется символ "*", например, выражение

/message/header/*

выбирает все дочерние элементы всех элементов header в элементе message.

С помощью оператора "|" можно выбрать в выражении XPath несколько путей, например, выражение:

/message/header/from | /message/header/to

выбирает в документе все элементы from и все элементы to заголовка.

5.1.1.5.2. Шаги адресации

Шаги адресации (location steps) состоят из трех компонент:

  •  оси (axis), указывающей дерево взаимоотношений между текущим узлом контекста и узлами, отбираемыми на данном шаге адресации;
  •  правила проверки узлов, указывающего тип и расширенное название узлов, отбираемых на данном шаге адресации;
  •  нуля или более предикатов, использующих произвольные выражения для дальнейшего отбора в наборе узлов, собранных на данном шаге адресации.

Шаг адресации имеет следующий синтаксис:

имя-оси::проверка-узла[предикат]

Синтаксис шага адресации образуется из названия оси и правила проверки узлов, отделенных друг от друга двумя символами двоеточия.

Набор узлов, собранных на данном шаге адресации, – это  множество узлов, полученных в результате обработки ранее собранного набора узлов с учетом оси, правила проверки узлов и последующего отсева полученного набора узлов каждым из представленных предикатов.

5.1.1.5.3. Оси 

Поиск в XML-документе начинается с контекстного узла в дереве XPath и выполняется относительно этого узла.

Ось определяет, какой узел относительно контекстного узла должен быть включен в процесс поиска. Ось также определяет порядок узлов в наборе узлов. Ось, выделяющая узлы, следующие за контекстным узлом в порядке расположения в документе, называется прямой. Ось, выделяющая узлы, предшествующие контекстному узлу, называется обратной. В спецификации XPath определено  13 осей, приведенные в таблице:

Название оси

Направление

Описание

self

нет

Сам контекстный узел.

parent

обратное

Родительский узел контекстного узла (если существует).

child

прямое

Дочерний узел контекстного узла (если существует).

ancestor

обратное

Предшествующий узел контекстного узла (если существует).

ancestor-or-self

обратное

Узел, предшествующий контекстному узлу или он сам.

descendant

прямое

Потомки контекстного узла.

descendant-or-self

прямое

Потомки контекстного узла или он сам.

following

прямое

Узлы документа XML, следующие за контекстным узлом, не включая потомков.

following-sibling

прямое

Узлы-братья, следующие за контекстным узлом.

preceding

обратное

Узлы документа XML, предшествующие контекстному узлу, не включая потомков

preceding-sibling

обратное

Узлы-братья, предшествующие контекстному узлу

attribute

прямое

Узлы-атрибуты контекстного узла

namespace

прямое

Узлы пространств имен контекстного узла

Исходный набор узлов образуется из узлов, имеющих с текущим узлом контекста взаимосвязь, определяемую указанной осью, имеющих тип узла и расширенное имя, отвечающих представленному правилу проверки узлов. Например, шаг адресации descendant::from находит элементы from, являющиеся потомками текущего узла контекста: descendant указывает, что каждый узел в первоначальном наборе должен быть потомком текущего узла контекста, а from указывает, что каждый узел в исходном наборе должен быть элементом с названием from.

5.1.1.3.4. Правила проверки

Ось имеют тип главного узла, соответствующий типу узла, который ось может выделять. Для осей атрибутов типом главного узла является attribute. Для осей пространства имен типом главного узла является namespace. Для остальных осей типом главного узла является element.

Оси выделяют набор узлов из дерева документа. Этот набор узлов уточняется с помощью проверки узлов. В спецификации XPath определены следующие правила проверки узлов:

  •  * – выделяет все узлы, соответствующие типу главного узла;
  •  node() – выделяет  все узлы без учета их типа;
  •  text() – выделяет все текстовые узлы;
  •  comment() – выделяет все узлы-комментарии;
  •  processing-instruction(имя-программы) – выделяет все инструкции по обработке с заданным именем программы обработки (если аргумент не задан, выделяются все инструкции по обработке);
  •  element(имя-узла) – выделяются все узлы-элементы с заданным именем (если в качестве аргумента задан символ "*", выделяются все узлы-элементы);
  •  element(имя-узла, тип-узла) – выделяются все узлы-элементы с заданным именем и заданным типом в схеме документа (значением атрибута type в объявлении элемента  документа);
  •  attribute(@имя-атрибута) – выделяются все узлы-атрибуты с заданным именем (если в качестве аргумента задан символы "@*" или аргумент не задан, выделяются все узлы-элементы);
  •  attribute(@имя-атрибута, тип-атрибута) – выделяются все узлы-атрибуты с заданным именем и заданным типом в схеме документа (значением атрибута type в объявлении атрибута документа);
  •  document-node(element(аргументы)) отбирает все корневые узлы документа, содержимое которых состоит в точности из одного вложенного элемента,
    удовлетворяющего тесту
    element(аргументы).

Примеры использования правил проверки:

1. child::text() – выбирает все текстовые дочерние элементы текущего узла.

2. child::from– выбирает все элементы from, являющиеся прямыми потомками текущего узла (если у текущего узла нет прямых потомков, будет выбран пустой набор узлов).  

3. child::* – выбирает все дочерние элементы текущего узла.

5.1.1.5.5. Предикаты

При выборе узлов каждый шаг выборки может иметь один или несколько предикатов, которые будут фильтровать выбираемый набор узлов. Предикат – это  логическое выражение, вычисляемое для каждого узла выбранного набора, и только в том случае, если результатом является истина, узел остается в фильтруемом наборе.

Фильтрация набора узлов выполняется следующим образом:

  •  Фильтруемое множество сортируется в направлении просмотра оси навигации данного шага. Для осей ancestor, ancestor-or-self, preceding, preceding-sibling фильтруемое множество сортируется в обратном порядке просмотра документа, для остальных осей – в прямом порядке просмотра.
  •  Выражение предиката вычисляется для каждого узла отсортированного множества в следующем контексте:

• Фильтруемый узел (тот, для которого в данный момент вычисляется предикат) становится контекстным узлом.

• Количество узлов фильтруемого множества становится размером контекста.

• Позиция фильтруемого узла в отсортированном множестве становится позицией контекста.

  •  Результат вычисления предиката преобразуется в булевский тип согласно следующим правилам:

• Если результатом вычисления является число, равное позиции контекста, булевым значением предиката будет true, в противном случае – false. Например, предикат [2] равносилен предикату [position()=2] – он обратится в истину только для второго узла фильтруемого множества.

• Все остальные типы данных приводятся к булевому типу в соответствии с приведенными выше правилами.

  •  Из фильтруемого множества исключаются все узлы, булевское значение предиката для которых было ложью.
  •  В случае, если в шаге выборки было несколько предикатов, процедура фильтрации повторяется с каждым из них, оставляя в отфильтрованном множестве только те узлы, для которых каждый из предикатов будет истиной.

Таким образом, предикаты определяют свойства, которыми должны обладать выбираемые узлы.

Примеры использования предикатов:

1. child::cd[position()=1] – выбирает первый  дочерний элемент header  текущего узла.

2. child::header[position()=last()] – выбирает последний  дочерний элемент header  текущего узла.

3. child::header[position()=last()-1] – выбирает все, кроме последнего,  дочерние элементы header текущего узла.

4. child::header[attribute::address="ivanov@mail.com"] – выбирает все дочерние элементы header текущего узла, которые имеют атрибут address со значением ivanov@mail.com.

5.1.1.3.6. Сокращенный синтаксис путей адресации

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

В спецификации XPath определены следующие сокращения:

  •  если в шаге адресации не указана ось, то предполагается ось child::, поэтому ось child:: часто опускается при описании путей;
  •  символы ".." является сокращенной записью для выражения parent::node()(родительский узел);
  •  символы "//" является сокращенной записью для выражения /descendant-or-self::node()/ (корневой узел и все его потомки, т.е. все узлы документа);
  •   символ "@" является сокращенной записью для выражения attribute:: (дескриптор оси атрибутов).

Примеры использования сокращений в путях выборки:

  •  1. .//* — выберет все элементы-потомки контекстного узла.
  •  2. ..//*— выберет все дочерние элементы родителя контекстного узла.
  •  3. @*— выберет все атрибуты контекстного узла.
  •  4. //@* — выберет все атрибуты всех потомков контекстного узла.
  •  5. //* — выберет все элементы документа, содержащего контекстный узел.
  •  6. //@* — выберет все атрибуты всех элементов документа, содержащего контекстный узел.
  •  7. header/to — выберет элементы to, принадлежащие дочерним элементам header контекстного узла.
  •  8. from[@address and @image] – выбирает все  дочерние элементы from  текущего узла, которые имеют и атрибут address и атрибут image.
  •  9. to[@address="john@mail.com" or @address="ken@mail.com"] – выбирает все  дочерние элементы from  текущего узла, в которых атрибут address имеет либо значение  "john@mail.com", либо значение "ken@mail.com".

Файл: file:///web/1/5fan/public_html/www/files/13/5fan_ru_69057_6a9cb593613d60dba7a4dc4ec073bb44.doc   Создан: 2008-02-21T06:36:00Z Модифицирован: 2008-02-21T06:36:00Z     Автор:


 

А также другие работы, которые могут Вас заинтересовать

74812. Закон всемирного тяготения. Движение в поле тяготения. Центральные силы. Гравитационное поле и его напряженность 38.5 KB
  Если материальная точка совершает движение под действием центральной силы с центром O, то момент количества движения точки сохраняется, а она сама совершает движение в плоскости, перпендикулярной вектору момента количества движения относительно точки O и проходящей через эту точку O.
74813. Особенности творческого пути А.С. Грибоедова. История создания и публикации «Горя от ума». Чацкий как герой эпохи 1810 –1820-х годов и «вечный» конфликт «старого и нового». Элементы классицизма, романтизма и реализма в комедии 15.67 KB
  Элементы классицизма романтизма и реализма в комедии. Замысел комедии возник в 1820 году по некотором данным уже в 1816 но активная работа над текстом начинается в Тифлисе после возвращения Грибоедова из Персии. В 1825 году с большими цензурными сокращениями были напечатаны отрывки из I и III актов комедии но разрешение на её постановку получить не удалось. Роль Чацкого главная роль без которой не было бы комедии а была бы пожалуй картина нравов.
74814. А.С. Пушкин и начало «золотого века» русской литературы. Периодизация творчества писателя и его структура 15.17 KB
  Золотой век русской литературы – это плеяда гениев искусства слова, прозаиков и поэтов, которые благодаря своему изысканному и непревзойденному творческому мастерству, определили дальнейшее развитие русской культуры. Без сомнений, одним из ярчайших представителем Золотого века русской литературы является знаменитый поэт, отец русского литературного языка А. С. Пушкин.
74815. Полемика о творчестве А.С. Пушкина и литературно-эстетическое самосознание писателя. Значимость наследия А.С. Пушкина в истории русской и мировой культуры и опыт его осмысления 15.66 KB
  Пушкина и литературно-эстетическое самосознание писателя. Пушкина в истории русской и мировой культуры и опыт его осмысления. Пушкин был певцом и вдохновителем освободительного движения своего времени: как поэт свою заслугу перед народом он видел в том что будил чувства добрые и в свой жестокий век восславил свободу. Пушкин самый яркий выразитель чувств дум и стремлений своего времени.
74816. Поэты пушкинской эпохи и понятие «Плеяды». Общее и особенное в их авторских стратегиях: А.А. Дельвиг, П.А.Вяземский, Е.А.Боратынский, Д.В. Веневитинов, Н.М. Языков. Влияние их творческих исканий на дальнейшее развитие отечественной словесности 18.16 KB
  Термин пушкинская плеяда по мере изучения поэзии Пушкина романтической эпохи и конкретных поэтов стал считаться уязвимым поскольку вопервых возник по аналогии с наименованием французской поэтической группы Плеяда Ронсар Жодель Дюбелле и др. давая повод для неправомерных ассоциаций и неуместных сближений Пушкина с Ронсаром. Следовательно если принимать понятие пушкинская плеяда нужно отчетливо осознавать что в этом созвездии названном именем Пушкина последний является самой крупной звездой в то время как другие светила...
74817. Теория «официальной народности», социально-исторические концепции славянофилов и западников и их отражение в словесности второй половины 1830- х – первой половины 1850-х годов 15.67 KB
  Уваров доказывал что просвещение может быть не только источником зла революционных потрясений как это случилось в Западной Европе а может превратиться в элемент охранительный к чему следует стремиться в России. Поэтому всем служителям просвещения в России предлагалось исходить исключительно из соображений официальной народности. По мнению консерваторов николаевской эпохи в России не было причин для революционных потрясений. Бенкендорф прошедшее России было удивительно ее настоящее более чем великолепно что же касается ее...
74818. Традиции и новаторство М.Ю. Лермонтова - лирика в разработке смысла жизни, назначения поэзии, мотивов свободы и любви к Родине 14.69 KB
  Лермонтова лирика в разработке смысла жизни назначения поэзии мотивов свободы и любви к Родине. Лермонтова по праву считается одним из вершинных явлений в русской литературе. Кроме того в творчестве Лермонтова присутствуют такие темы и мотивы которые были несвойственны творчеству его старшего современника тема одиночества и бездомности тема потерянного поколения; тема земли и неба; тема маски скрытого или утраченного лица. В поэзии Лермонтова постоянно борются две противоположные стихии принимая разные обличья земли и неба...
74819. Становление психологического прозаического романа в творчестве М.Ю. Лермонтова. «Герой нашего времени» – квинтэссенция основных философско-этических идей писателя 15.46 KB
  Лермонтов вводит в роман в качестве центральной фигуры именно герояпсихолога. Ему во многом помогает раскрыть характер главного героя такая форма психологического анализа как монологисповедь в виде дневника в виде дневника написаны Тамань Княжна Мери и Фаталист В своих записках Печорин описывает психологическую игру которую он ведет с окружающими. Выделяется и меткость точность языка который противопоставляется готовым пышным фразам Грушницкого драпирующегося в манерноромантического героя. Раскрывает особенности...
74820. Н.В. Гоголь и развитие «высокой» комедии. Тематика «Ревизора» в свете социальных, этических и религиозных взглядов писателя 15.3 KB
  Гоголь и развитие высокой комедии. В начале декабря 1835 года Гоголь окончил Ревизора. Гоголь создает необычную для пьесы ситуацию: вместо одной личной или домашней интриги изображается жизнь целого города что значительно расширяет социальный масштаб пьесы и позволяет осуществить поставленную цель: ldquo;Собрать в одну кучу все дурное в Россииrdquo;. Гоголь создает новаторскую ситуацию когда раздираемый внутренними противоречиями город становится способным к цельной жизни благодаря общему кризису общему чувству страха низших перед...