13950

Выполнение запросов XQuery для документа XML

Лабораторная работа

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

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

Русский

2014-11-30

542 KB

14 чел.

Лабораторная работа 4-03

Выполнение запросов XQuery для документа XML 

1. Цель работы

Целью работы приобретение навыков формирования запросов к документам XML с использованием языков XPath 2.0 и XQuery.

  

2. Состав рабочего места

2.1. Оборудование: IBM-совместимый   персональный компьютер (ПК).

2.2. Программное обеспечение: операционная система Windows, программа XMLSpy.

3. Краткие теоретические сведения

3.1. Язык XPath 

3.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.

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

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

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

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

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

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

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

В XPath определено семь типов узлов и, соответственно, семь типов данных, представленных на рис. 4.3.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 пространства имен в расширенном имени.

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

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

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

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

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

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

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

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

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

+ – сложение;

- – вычитание;

* – умножение;

div – деление;

idiv – деление двух целых чисел;

mod – взятие модуля (определение остатка от деления чисел).

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

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

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

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

сравнение значений;

общее сравнение;

сравнение узлов.

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

gt – больше;

lt – меньше;

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

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

eq – равно;

ne – не равно.

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

> – больше;

< – меньше;

>= – больше или равно;

<= – меньше или равно;

= – равно;

!= – не равно.

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

is – проверка узлов-операндов на равенство;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.1.3.8. Циклы

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

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

return выражение

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

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

3.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.

3.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.

3.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);

операция запятая (,).

3.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 определены следующие основные виды функций и операторов:

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

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

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

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

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

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

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

as xs:dateTime?

3.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. Если типы аргументов не совпадают, перед выполнением операции выполняется преобразование к более общему типу.

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

op:numeric-equal – сравнение на равенство;

op:numeric-less-than – сравнение на меньше, чем;

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

Эти операторы возвращают true или 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.

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

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

функции сборки-разборки строк;

функции сравнения строк;

функции строковых значений;

функции поиска соответствия в строках;

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

3.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*

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

3.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.

3.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.

3.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, содержащейся в первой строке (если вторая строка не содержится в первой строке, возвращается пустая строка).

3.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").

3.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.

3.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 определены только сравнения на равенство и неравенство.

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

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

3.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.

3.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? – возвращает значение временной зоны для времени.

3.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.

Кроме приведенных выше операторов в 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.

3.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()? – возвращает корень дерева, к которому принадлежит узел (если аргумент не задан, возвращается корень дерева для текущего узла).

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

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

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

3.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 переставлены в случайном порядке.

3.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, если он содержит один элемент, в противном случае выдается ошибка.

3.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.

3.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);

3.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.  

3.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 – возвращает временную зону по умолчанию.

3.1.5. Выражения пути в XPath

3.1.5.1. Синтаксис выражений пути

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

Выражение пути состоит из одного или более шагов, каждый из которых отделяется один от другого либо с помощью  символа "/",  либо с помощью  символов "//". Выражение пути может также начинаться с символов "/"или "//". Результатом каждого шага поиска является последовательность узлов (возможно пустая).

Если выражение пути начинается с символа "/", то поиск начинается с корневого узла документа, а если с символов  "//" – с контекстного узла документа, включая сам контекстный узел. Если символ  "/" задан внутри выражения пути, то выполняется переход к следующему шагу поиска. Символы "//" внутри выражения пути означают, что следующий шаг поиска будет выполняться для потомков контекстного узла документа, включая сам контекстный узел.

В XPath 2.0 определены два вида шагов поиска:

шаг с использованием оси поиска (axis step);

шаг с использованием фильтра (filter step).

3.1.5.2. Шаги с использованием оси поиска

Шаги с использованием оси поиска состоят из трех компонент:

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

правила проверки узлов, указывающего тип и расширенное название узлов, отбираемых на данном шаге адресации;

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

Шаг с использованием оси поиска имеет следующий синтаксис:

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

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

Пример документа XML:

Следующий документ XML (email.xml) содержит пять сообщений электронной почты:  

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

<email-folder>

<message>

<!-- Сообщение 1 -->

<header>

<address>

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

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

  </address>

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

</header>

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

 </message>

<message>

 <!-- Сообщение 2 -->

<header>

<address>

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

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

  </address>

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

</header>

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

</message>

<message>

 <!-- Сообщение 3 -->

<header>

<address>

   <from value="sidorov@mail.com"/>

   <to value="ivanov@mail.com"/>

  </address>

  <subject>Отказ</subject>

</header>

<body>Я не смогу в это время.</body>

</message>

<message>

 <!-- Сообщение 4 -->

<header>

<address>

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

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

  </address>

  <subject>Вопрос</subject>

</header>

<body>Когда ты может подойти?</body>

</message>

<message>

 <!-- Сообщение 5 -->

<header>

<address>

   <from value="sidorov@mail.com"/>

   <to value="ivanov@mail.com"/>

  </address>

  <subject>Ответ</subject>

</header>

<body>Я смогу подойти в 12.30.</body>

</message>

</email-folder>

3.1.5.2.1. Оси 

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

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

Ось self определяет сам контекстный узел (эта ось не имеет направления).

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

ось self – сам контекстный узел;

ось child – все дочерние узлы контекстного узла следующих типов: узлы элементов, текстовых узлов, узлов комментариев и инструкций по обработке (узлы документов, атрибутов и пространств имен не могут быть дочерними узлами);

ось descendantвсе потомки контекстного узла, т.е. все дочерние узлы, дочерние узлы дочерних узлов и так далее;

ось descendant-or-selfсам контекстный узел и все его потомки;

ось following-sibling – все узлы, имеющие тот же родительский элемент, что и контекстный узел, и следующие по порядку за контекстным узлом (если узел является узлом атрибута или узлом пространства имен, эта ось пуста);

ось following – все узлы, имеющие тот же корневой элемент, что и контекстный узел, не являющиеся потомками контекстного узла и следующие по порядку за контекстным узлом;

ось attribute – все узлы атрибутов контекстного узла (эта ось пуста если контекстный узел не является элементом);

ось namespace – все узлы пространства имен контекстного узла (эта ось пуста если контекстный узел не является элементом).

Рис. 5.1.2. Дерево XPath и оси для документа email.xml

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

ось parent – родительский узел контекстного узла (если узел не имеет родительского узла, эта ось пуста);

ось ancestorвсе предки контекстного узла, т.е. родительский узел,  родительский узел родительского узла и так далее;

ось ancestor-or-selfсам контекстный узел и все его предки;

ось preceding-sibling – все узлы, имеющие тот же родительский элемент, что и контекстный узел, и следующие по порядку перед контекстным узлом (если узел является узлом атрибута или узлом пространства имен, эта ось пуста);

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

3.1.5.2.2. Проверка узла

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

проверка узлов по имени (name test);

проверка узлов по виду (kind test).

При проверке узлов по имени в качестве критерия поиска задается уточненное имя узла (литерал типа QName), т.е. префикс – имя или имена пространств имен, и локальное имя. Имена пространства имен и локальное имя отделяются друг от друга символами ":". Если имя определено в пространстве имен по умолчанию, то префикс отсутствует.

Если вместо префикса указан символ  "*", выбирается узел с заданным локальным именем во всех пространствах имен. Если же символ  "*" указан вместо имени узла,  выбираются все узлы в заданном пространстве имен.

Если вместо уточненного имени узла задан символ  "*", то выбор выполняется для контекстного узла.

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

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

Для документа email.xml можно задать следующие правила проверки:

1. self::header – выбираются все узлы header.

2. child::header – выбираются все дочерние узлы (address и subject) всех узлов header.

3. parent::header – выбираются все родительские узлы message узлов header.

4. ancestor::header – выбираются все узлы message и корневой узел email-folder узлов header.

5. ancestor-or-self::headerвыбираются все узлы message, корневой узел email-folder и сами узлы header.

6. descendant::* – выбираются все потомки контекстного узла.

7. attribute::from – выбираются все атрибуты всех узлов from.

8. attribute::* – выбираются все атрибуты контекстного узла.

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

element(имя-элемента) – выбирает все узлы-элементы с заданным именем-элемента (если в качестве аргумента задан символ "*", выбираются все узлы-элементы);

element(имя-элемента, тип-элемента) – выбирает все узлы-элементы с заданным именем-элемента и заданным типом-элемента в схеме документа (тип узла определяется либо значением атрибута type в объявлении элемента, либо имени простого или комплексного типа элемента). Если в качестве имени-элемента задан символ "*", выбираются все узлы-элементы, если же в качестве типа-элемента задан символ "*", выбираются узлы-элементы всех типов;

schema-element(имя-элемента) – выбирает все узлы-элементы с заданным в схеме документа объявлением элемента с заданным именем типа QName;

node() – выбирает  все узлы без учета их типа;

text() – выбирает все текстовые узлы;

comment() – выбирает все узлы-комментарии;

processing-instruction(имя-программы) – выбирает все инструкции по обработке с заданным именем-программы обработки (если аргумент не задан, выделяются все инструкции по обработке);

attribute(имя-атрибута) – выбирает все узлы-атрибуты с заданным именем (если в качестве аргумента задан символы "*" или аргумент не задан, выделяются все узлы-атрибуты);

attribute(имя-атрибута, тип-атрибута) – выбирает все узлы-атрибуты с заданным именем и заданным типом в схеме документа (тип узла определяется либо значением атрибута type в объявлении атрибута, либо имени простого или комплексного типа атрибута). Если в качестве имени-атрибута задан символ "*", выделяются все узлы-атрибуты, если же в качестве типа-атрибута задан символ "*", выделяются узлы-атрибуты всех типов;

schema-attribute(имя-атрибута) – выбирает все узлы-атрибуты с заданным в схеме документа объявлением атрибутом с заданным именем типа QName;

document-node(аргумент) выбирает все корневые узлы документа, содержимое которых состоит в точности из одного вложенного элемента.
В качестве аргумента задается  либо одна из приведенных выше функций
element(), либо функция schema-element().

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

Для документа email.xml можно задать следующие правила проверки:

1. descendant::text() – выделяет все текстовые элементы потомков контекстного узла.

2. child::element(subject) – выбирает все дочерние элементы с именем subject для контекстного узла.

3. child::element() – выбирает все дочерние элементы контекстного узла (без текстовых узлов и узлов-атрибутов).

4. child::element(*, xs:string) – выбирает все дочерние элементы контекстного узла, содержимое которых является текстовым.  

5. attribute::attribute(value) – выбирает все атрибуты контекстного узла.

3.1.5.2.3. Предикаты

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

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

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

Выражение предиката вычисляется для каждого узла отсортированного множества в следующем контексте:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5. child::address[attribute::value="ivanov@mail.com" or

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

3.1.5.2.4. Сокращенный синтаксис выражений с использованием путей поиска

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

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

если в шаге адресации не указана ось, то предполагается ось child::, поэтому ось child:: часто опускается при описании путей;

символы ".." являются сокращенной записью для выражения parent::node()(родительский узел);

символы "//" является сокращенной записью для выражения /descendant-or-self::node()/ (корневой узел и все его потомки, т.е. все узлы документа);

символ "@" является сокращенной записью для выражения attribute:: (оси атрибутов).

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

1. .//* — выберет все элементы-потомки контекстного узла.

2. ..//*— выберет все дочерние элементы родителя контекстного узла.

3. @*— выберет все атрибуты контекстного узла.

4. //@* — выберет все атрибуты всех потомков контекстного узла.

5. //* — выберет все элементы документа, содержащего контекстный узел.

6. //@* — выберет все атрибуты всех элементов документа, содержащего контекстный узел.

7. /to — выберет элементы to, принадлежащие дочерним элементам address контекстного узла.

8. to[@value="ivanov@mail.com" or @value="petrov@mail.com"] – выбирает все  дочерние элементы to  текущего узла, в которых атрибут value имеет либо значение  "ivanov@mail.com", либо значение "petrov@mail.com".

3.1.5.3. Шаги с использованием фильтров

Шаги с использованием фильтров имеют следующий синтаксис:

первичное-выражение[предикат]

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

числовой литерал (литерал типа xs:integer, xs:decimal или xs:double);

строковый литерал (литерал типа xs:string);

ссылка на переменную (имя переменной, перед которым стоит символ "$");

вызов функции.

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

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

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

1. (11 to 20)[6] – выбирает шестой элемент (число 16) в последовательности от 11 до 20.

2. (11 to 20)[. mod 2 eq 1] – выбирает нечетные элементы последовательности от 11 до 20 (числа 11, 13, 15, 17 и 19).

3. $header-node[fn:position() = (1 to 3)] – выбирает первые три элемента последовательности в переменной $header-node.

4. fn:doc("email.xml")/fn:root("header") – выбирает корневой элемент для элемента header в документе email.xml.

5. $header-node/comment() – выбирает узлы комментариев для последовательности в переменной $header-node.

3.2. Язык XQuery

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

Первую задачу – поиск необходимых данных в документах XML решает язык XPath 2.0. Язык XQuery был разработан как расширение XPath 2.0, позволяющее с помощью набора операторов  сформировать запрос к документу XML и получить ответ в виде фрагмента документа XML или полного документа XML.

Спецификация языка XQuery (XQuery 1.0) была принята консорциумом W3 в январе 2007 г. Отдельно была принята спецификация языка XQueryX, в котором запрос к данным формируется как документ XML.

Из осей, определенных в XPath, обязательными для реализации обработчиками XQuery являются оси self, child, parent, descendant, descendant-or-self и attribute. Поддержка осей ancestor, ancestor-or-self, following, following-sibling, preceding и preceding-sibling является необязательной и зависит от реализации.

3.2.1. Структура запроса XQuery

Запрос XQuery задается в текстовом файле с расширением .xq, .xql или .xquery и состоит из необязательного объявления версии, а также одного и более фрагментов, называемых модулями.

Объявление версии имеет следующий вид:

xquery version "номер-версии" encoding "кодировка";

Для номера-версии можно пока задать только значение "1.0". Необязательный параметр encoding задает кодировку документа XQuery, например, "utf-8"или "windows-1251".

Модуль может быть либо главным модулем, либо библиотечным модулем.

3.2.1.1. Главный модуль

Главный модуль состоит из пролога, за которым следует тело запроса.

Пролог содержит:

  •  объявления параметров настройки;
  •  объявления переменных;
  •  объявления функций;
  •  объявления опций;
  •  операторы импорта;
  •  объявления пространства имен.
  •  Разделителем между компонентами пролога является символ ";".

3.2.1.1.1. Объявления параметров настройки

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

  •  правила обработки граничных пробелов в выражениях;
  •  базовый URI для запроса;
  •  режим работы конструкторов;
  •  режим следования узлов;
  •  порядок следования пустых последовательностей;
  •  копирование пространства имен;
  •  упорядочивание строк по умолчанию.

Правила обработки граничных пробелов в выражении задаются с помощью следующего объявления:

declare boundary-space тип-обработки;

Если для типа-обработки задано значение strip, пробелы в начале и в конце вычисляемого выражения удаляются, если же задано значение preserve – сохраняются.

Базовый URI задается с помощью следующего объявления:

declare base-uri "URI";

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

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

declare construction strip тип-обработки;

Если для типа-обработки задано значение strip, типом сконструированного элемента является xs:untyped, все копируемые во время конструирования элементы также получают тип xs:untyped, а атрибуты получают тип xs:untypedAtomic. Если задано значение preserve, типом сконструированного элемента является xs:anyType, а все копируемые во время конструирования элементы и атрибуты сохраняют свои типы.

Режим следования узлов задается с помощью объявления:

declare ordering режим-следования;

Если для режима-следования задано значение ordered, узлы в выражениях пути обрабатываются в том порядке, в котором они следуют в документе, если же задано значение unordered, узлы следуют друг за другом в порядке, определяемом реализацией обработчика запросов.

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

declare default order порядок-следования;

Если для порядка-следования задано значение empty greatest, пустой узел выводится последним, если же задано значение empty least, пустой узел выводится первым.

Копирование пространства имен управляет процессом обработки при копировании узла элемента с помощью конструктора элемента или документа и задается с помощью объявления:

declare copy-namespaces  режим-сохранения, режим-наследования;

Если для режима-сохранения задано значение preserve, все пространства имен сохраняются в скопированном элементе, если же задано значение no-preserve, сохраняются только те пространства имен, которые используются в именах элементов и их атрибутов. Если для режима-наследования задано значение inherit, копируемый узел наследует все доступные пространства имен первоначального узла вместе с узлами, сохраняемыми в копируемом элементе с помощью задания параметра  preserve. Если же задано значение no-inherit, доступные пространства имен не сохраняются в копируемом элементе.

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

declare default collation "URI"; 

где параметр "URI"задает ресурс, в котором определены правила сравнения символов строк.

3.2.1.1.2. Объявления переменных

Объявление переменной с именем имя-переменной (типа QName), типом, определенным в  типе-переменной и начальным значением, задаваемым выражением, имеет следующий вид:

declare variable $имя-переменной as тип-переменной := выражение;

Если заданы ключевое слово as и тип-переменной, то создается переменная заданного типа.  Если эти компоненты не заданы тип переменной определяется из типа результата вычисления выражения. Выражение может содержать объявленные ранее переменные.

Переменные, объявленные без префикса пространства имен, не определены ни в одном пространстве имен и могут быть заданы только в главном модуле.

Переменная, объявленная в другом, импортируемом модуле, должна быть объявлена как внешняя переменная следующим образом:

declare variable $имя-переменной as тип-переменной external;   

Если в этом объявлении задан тип переменной, он должен совпадать с типом переменной в импортируемом модуле.

Примеры задания переменных:

1. declare variable $a as xs:integer :=17; – задана целая переменная $a с начальным значением 17.

2. declare variable $str:="abc"; – задана строковая переменная $a с начальным значением "abc" (тип переменной определяется в результате вычисления выражения).

3. declare variable $math:pi as xs:double external;задана переменная с двойной точностью $math:pi, объявленная в импортируемом модуле.  

3.2.1.1.3. Объявления функций

Объявление функции с именем имя-функции (типа QName) имеет следующий вид:

declare function имя-функции($имя-параметра-1 as тип-параметра-1, …) 

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

{

 тело-функции

};

Если имя функции не имеет префикса, имя функции считается заданным в пространстве имен по умолчанию. Для каждого параметра задается его имя и тип. Если ключевое слово as и тип-параметра не задан, либо не задано ключевое слово as и тип-возвращаемого-значения, по умолчанию принимается тип item()*, т.е. произвольная последовательность. После типа параметра или возвращаемого значения может следовать:

символ "?", означающий, что данный параметр может быть задан, а может быть не задан;

символ "*", означающий, что данный параметр может быть задан 0 и более раз;

символ "+", означающий, что данный параметр может быть задан 1 и более раз.

В теле-функции задаются выражения (как правило, конструкторы), реализующие алгоритм функции.

Функции в XQuery могут быть рекурсивными, т.е. в теле функции может быть задан вызов самой функции.

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

Вызов функции имеет следующий вид:

имя-функции(аргумент-1, аргумент-2,…)  

С помощью следующего объявления функция может быть задана как внешняя:

declare function имя-функции($имя-параметра-1 as тип-параметра-1, …) 

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

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

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

3.2.1.1.4. Объявления опций  

Объявления опций имеют следующий вид:

declare option имя-опции  "строковый-литерал";

Это объявление определяет опцию с заданным именем и строковым значением. Набор опций и их действия определяется используемым обработчиком запросов XQuery.

3.2.1.1.5. Операторы импорта

Операторы импорта могут импортировать данные из другого (библиотечного) модуля или из схемы документа XML.

Оператор импорта библиотечного модуля имеет следующий вид:

import module namespace пространство-имен="целевое-URI"

at "URI-1,…";

В параметре пространство-имен задается префикс целевого пространства имен, а в его значении "целевое-URI" задается идентификатор ресурса для целевого пространства имен. Это целевое пространство имен будет пространством имен по умолчанию для имен переменных и функций, определенных в модуле. После ключевого слова at указывается идентификатор или идентификаторы ресурса для импортируемого модуля. Если в реализации обработчика запросов XQuery можно использовать альтернативный способ задания местоположения импортируемых модулей, ключевое слова at и идентификатор ресурса можно пропустить.

Примеры задания оператора импорта библиотечных модулей:

1. import module namespace myns1="http://my.domain/ns1"

at "http://my.domain/ns1.xq"; – импортирует модуль по адресу "http://my.domain/ns1.xq" с целевым пространством имен myns1, определенным по адресу "http://my.domain/ns1".

2. import module namespace math="http://example.org/math-functions"; – импортирует модуль с целевым пространством имен math, определенным по адресу "http://example.org/math-functions".

Оператор импорта схемы документа XML имеет одну из следующих форм:

import schema namespace пространство-имен="целевое-URI"

at "URI-1,…";

или

import schema default element namespace "целевое-URI"

at "URI-1,…";

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

Примеры задания оператора импорта схемы документа XML:

1. import schema namespace xsd1="http://my.domain/nsxsd1"

at "http://my.domain/nsxsd1.xsd"; – импортирует схему по адресу "http://my.domain/nsxsd1.xsd" с целевым пространством имен xsd1, определенным по адресу "http://my.domain/nsxsd1".

2. import schema default element 

namespace "http://my.dom2/xsd2"; – импортирует схему с целевым пространством имен, которое становится пространством по умолчанию.

3.2.1.1.6. Объявления пространства имен

Объявление пространства имен имеет следующий вид:

declare namespace пространство-имен="URI";

Параметр пространство-имен объявляет префикс пространства имен, а его значение задает адрес ресурса для этого пространства имен.

В результате этого объявления создается новый узел пространства имен, связанный с заданным ресурсом.

Пример объявления пространства имен:

declare namespace email="http://email.com"; – объявляет пространство имен  с префиксом email по адресу "http://email.com".

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

xml=http://www.w3.org/XML/1998/namespace – пространство имен XML;

xs=http://www.w3.org/2001/XMLSchema – пространство имен схемы XML;

xsi=http://www.w3.org/2001/XMLSchema-instance – пространство экземпляров схем XML;

fn=http://www.w3.org/2005/xpath-functions – пространство имен функций XPath;

local=http://www.w3.org/2005/xquery-local-functions – пространство имен локальных функций, задаваемых с помощью объявления функции.

Тело запроса, содержащее выражение, вычисляется, и полученное значение является результатом запроса. Формирование тела запроса рассмотрено ниже.

3.2.1.2. Библиотечный модуль

Модуль, не содержащий тела запроса, называется библиотечным модулем. Первым оператором библиотечного модуля является оператор объявления модуля

module namespace пространство-имен="целевое-URI";

В параметре задается префикс целевого пространства имен в модуле, а в его значении "целевое-URI" задается идентификатор ресурса для целевого пространства имен.

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

Пример задания оператора объявления модуля:

module namespace math="http://example.org/math-functions"; – объявляет модуль с целевым пространством имен  с префиксом math по адресу "http://example.org/math-functions".

3.2.2. Конструкторы XQuery

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

прямой конструктор (direct constructor);

вычисляемый конструктор (computed constructor).

3.2.2.1. Прямой конструктор  

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

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

Если символы "{" и "}"  используются в конструкторе как обычные символы, они должны быть удвоены, т.е. заменены символами "{{" и "}}". Можно также использовать ссылки на символы: &#x7b; для символа "{" и &#x7d; для символа "}".

Результатом действия конструктора является новый узел-элемент.

Начальный тег конструктора и вложенных элементов может содержать один и более атрибутом. Имя атрибута должно быть типа QName, а значение – строкой, заключенной в одиночные или двойные апострофы. Так же, как и содержимое элемента, значение атрибута может содержать вычисляемые выражения в фигурных скобках "{" и "}".

Каждый атрибут в прямом конструкторе элемента создает свой собственный узел-атрибут.

Текстовым значением созданного узла является конкатенация содержимого всех входящих в него текстовых узлов.

Прямые конструкторы узлов комментариев и узлов инструкций по обработке записываются в конструкторе в том виде, в каком они появятся в документе XML.

Пример задания прямого конструктора:

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

xquery version "1.0";

declare variable $email-server as xs:string:="mail.com";

<message>

<header>

  <address>

<from value="{fn:concat('ivanov','@',$email-server)}"/>

<to value="{fn:concat('sidorov','@',$email-server)}"/>

  </address>

  <subject>О встрече</subject>

     </header>

<body>{fn:concat("Встреча сегодня ",

  fn:substring(xs:string(fn:current-date()),1,10),

    " в 12.30")}</body>

</message>

Результат обработки запроса имеет следующий вид:

<message>

<header>

 <address>

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

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

 </address>

 <subject>О встрече</subject>

</header>

 <body>Встреча сегодня 2008-03-01 в 12.30</body>

</message>

3.2.2.2. Вычисляемый конструктор

Вычисляемые конструкторы могут создавать узлы следующих видов:

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

3.2.2.2.1. Вычисляемые конструкторы элемента и атрибута

Вычисляемый конструктор элемента имеет одну из следующих форм:

element имя-элемента {выражение-для-содержимого}

или

element {выражение} {выражение-для-содержимого}

В первой форме создается элемент с заданным именем-элемента и вычисляемым содержимым. Во второй форме имя элемента является результатом вычисления выражения.

Аналогичным образом определяются формы вычисляемого конструктора атрибута:

attribute имя-атрибута {выражение-для-значения}

или

attribute {выражение} {выражение-для-значения}

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

Пример задания вычисляемых конструкторов элементов и атрибутов:

3.2.2.2.2. Вычисляемый конструктор документа

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

document {выражение}

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

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

text {выражение}

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

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

comment {выражение}

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

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

processing-instruction приложения {содержимое}

или

processing-instruction {выражение} {содержимое}

В первой форме создается инструкция по обработке с заданным значением параметра приложение (типа NCName) и вычисляемым параметром содержимое (типа xs:string). Во второй форме параметр приложение является результатом вычисления выражения.

3.2.3. Выражения FLWOR

Запрос к документу XML имеет одну из следующих общих форм:

оператор-for  

оператор-let

оператор-where  

оператор-order-by 

return выражение

По первым буквам используемых в выражении операторов (for, let, where, order by и return) эти выражения были названы выражениями FLWOR.

Обязательный оператор return конструирует результат выполнения выражения и возвращает его как результат выполнения всего выражения FLWOR.

3.2.3.1. Операторы for, let и return

Операторы for и let имеют следующий вид:

for $переменная-1 as тип-1 at $ переменная-цикла-1 in выражение-1,

$переменная-2 as тип-2 at $ переменная-цикла-2 in выражение-2,…

let $переменная-1 as тип-1 := выражение-1,

$переменная-2 as тип-2 := выражение-2,…

Операторы for и let генерируют упорядоченную последовательность узлов и/или атомарных значений. В выражении может быть более одного оператора for и/или let, но обязательно должен быть хотя бы один из них. Каждое выполнение операторов for и let формируют кортеж (turple) – упорядоченный набор из одной или нескольких переменных.

В простом случае в операторе for определена одна переменная и заданное для нее выражение (значение этого выражения называется связывающей последовательностью для переменной).  Оператор for выполняет итерацию по элементам связывающей последовательности. Если же в операторе for определены несколько переменных,  итерация выполнятся для каждой переменной по элементам ее связывающей последовательности. Результатом этих операций является поток кортежей (turple stream), содержащий один кортеж для каждой комбинации значений в соответствующих связывающих последовательностях.

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

Для каждой переменной, задаваемой в операторах for и let, может быть определен (после ключевого слова as)  тип переменной. Тип результата вычисления выражения для переменной должен совпадать с заданным типом переменной.

В операторе for каждая переменная может иметь заданную для нее (после ключевого слова at) индексную переменную, которая имеет тип xs:integer. При итерации переменных по элементам связывающей последовательности, индексная переменная выполняет итерацию над целыми, представляющими индексы этих элементов в связывающей последовательности, начиная с 1. Расширенное имя QName для индексной переменной должно отличаться от расширенного имени QName переменной, для которой задана индексная переменная.

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

3.2.3.2. Оператор where

Необязательный оператор where имеет следующую форму:

where выражение

Этот оператор выполняет роль фильтра для кортежей связанных переменных, полученных в результате выполнения операторов for и let. Заданное в операторе выражение вычисляется для каждого из кортежей  и, если результат вычисления равен true, кортеж остается в последовательности. Если же  результат вычисления равен false, кортеж удаляется из последовательности.

3.2.3.3. Оператор order by

Необязательный оператор order by изменяет порядок вывода элементов в кортеже и имеет одну из следующих форм:

order by выражение-1 модификатор-порядка-1,…

или

stable order by выражение-1 модификатор-порядка-1,…

Элемент модификатор-порядка состоит из трех компонент, каждая из которых является необязательной.

Первая компонента может иметь либо значение ascending (сортировка в возрастающем порядке), либо значение descending (сортировка в убывающем порядке).

Вторая компонента может иметь либо значение empty greatest (пустой элемент – в конце потока кортежей), либо значение empty least (пустой элемент – в начале потока кортежей).

Третья компонента задается в виде

collation "URI" 

где "URI"  – ссылка на ресурс, содержащий правила сравнения строк.

Если оператор order by задан,  для каждого кортежа в потоке кортежей вычисляются значения выражения с учетом связей переменных. Относительный порядок двух кортежей определяется сравнением их значений слева направо в соответствии с заданным выражением и модификатором-порядка  пока не встретится пара неравных значений.

Если в операторе order by используется ключевое слово stable, при сравнении, если два кортежа равны, они сохраняют тот же относительный порядок, что и в исходной последовательности.

3.3. Выполнение запросов XQuery в среде XMLSpy

3.3.1. Создание файла запроса в XMLSpy

Для создания файла запроса XQuery надо нажать кнопку на панели инструментов или выполнить команду New в меню File. В открывшемся окне выбирается тип документа (xq, xql или xquery) (рис. 4.3.2) и нажимается кнопка OK.

Рис. 4.3.2. Выбор типа документа для запроса XQuery

Затем в окне Create new XQuery file (рис. 4.3.3) выбрать вторую радиокнопку.

Рис. 4.3.3. Выбор метода создания запроса XQuery

В результате открывается окно ввода и редактирования запроса, в котором в текстовом режиме вводится запрос XQuery (рис. 4.3.4). При использовании кириллицы в содержимом запроса  необходимо выполнить команду Encoding в меню File и выбрать в диалоговом окне Encoding кодировку Codepage 1251 (Cyrillic).

Рис. 4.3.4. Редактор и панели для создания и редактирования запросов XQuery

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

  •  панель ключевых слов XQuery (XQuery Keywords);
  •  панель переменных XQuery (XQuery Variables);
  •  панель функций XQuery (XQuery Functions).

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

Для проверки действительности запроса XQuery надо нажать на кнопку , либо выполнить команду Validate в меню XML, либо нажать клавишу F8. Компонент, в котором произошла ошибка, выделяется темно-серой подсветкой, а в нижней части редактора выводится значок , после которого располагается текст сообщения об ошибке. Если документ действительный, выводится значок .

Затем с помощью команды Save As меню File запрос XQuery сохраняется как файл с соответствующим расширением на диске.

3.3.2. Выполнение запроса XQuery

После окончания редактирования запроса можно его выполнить с помощью кнопки на панели инструментов, либо при выборе команды XQuery Execution и меню XSL/XQuery, либо с помощью клавиш Alt+F10.

При выполнении запроса сначала открывается окно задания документа XML для запроса (рис. 4.3.5).

Рис. 4.3.5. Окно определения документа XML для запроса XQuery

Исходный документ для запроса можно определить, просто задав его имя в поле Choose a file. Для выбора документа с помощью окна Windows Открыть надо нажать кнопку Browse, выделить документ и нажать кнопку Открыть. Если документ уже открыт в одном из окон  XMLSpy, его можно выбрать, нажав на кнопку Window, выделить нужный файл и нажать кнопку OK (рис. 4.3.6).

Рис. 4.3.6. Окно выбора документа для запроса XML

После выбора документа XML для выполнения запроса нажимается кнопка Execute. Если для выполнения запроса документ XML не нужен или он определен в самом запросе, надо нажать на кнопку Skip XML (рис. 4.3.5).    

Если запрос содержит ошибки, то в нижней части редактора выводится текст сообщения об ошибке, в противном случае открывается новое окно документа XML с именем  XQuery Output.xml, в котором выводится результат запроса.

При необходимости с помощью команды Save As меню File документ XML – результат запроса можно сохранить с другим именем  на диске. Перед сохранением файла с документом XML надо изменить кодировку документа следующим образом:

  •  выбрать в меню File команду Encoding  и в открывшемся Encoding установить любую кодировку;
  •  вручную исправить выбранную кодировку в параметре encoding на кодировку "windows-1251".  

После этого сохранение файла выполняется с помощью окна Сохранить как команды  Save As меню File.

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

  •  выбрать в меню File команду Encoding  и в открывшемся Encoding установить любую кодировку;
  •  вручную исправить выбранную кодировку в параметре encoding на кодировку "windows-1251";
  •  вызвать окно Сохранить как команды  Save As меню File;
  •  в раскрывающемся меню  Тип файла выбрать тип Документ HTML (*.html);
  •  полностью (с расширением .html) ввести имя сохраняемого файла и нажать кнопку Сохранить. 

Просмотреть полученный документ XML можно либо при выборе команды Browser view меню View в XMLSpy, либо в Web-браузерах Internet Explorer или Firefox.

Просмотреть документ HTML можно также либо  при выборе команды Browser view меню View в XMLSpy, либо в любом Web-браузере.

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

Создайте запрос XQuery для документа XML вашего варианта, созданного в  лабораторной работы 4-01 и измененного в лабораторной работе 4-02.

Вариант 3-01

Создайте следующие запросы XQuery для документа XML, содержащего статьи газеты:

  •  вывод документа XML с корневым элементом  politics для вывода заголовков и авторов статьи, у которых значение  атрибута section элемента article равно "politics";
  •  вывод документа  XML с корневым элементом  selected-article, содержащий статью с заданным заголовком;
  •  вывод документа HTML, содержащего заголовок, автора статьи и резюме (автор и наименование статьи должны быть выделены с помощью стилей).   

Вариант 3-02

Создайте следующие запросы XQuery для документа XML, содержащего описания пакетов языка Java:

  •  вывод документа XML с корневым элементом  selected-packets для вывода наименований и описаний пакетов, начинающихся на заданную букву;
  •  вывод документа  XML с корневым элементом  selected-classes, содержащий имя пакета, имя класса и описание класса для заданного класса;
  •  вывод документа HTML, содержащего для заданного имени пакета: описание пакета, имена интерфейсов, классов, исключений и ошибок (имя пакета должно быть выделено с помощью стилей).

Вариант 3-03

Создайте следующие запросы XQuery для документа XML, содержащего описания научных статей:

  •  вывод документа XML с корневым элементом  computer-articles для вывода авторов, наименований и аннотаций статей по компьютерной тематике;
  •  вывод документа  XML с корневым элементом  recent-articles, содержащий авторов и наименования, принятых после заданной даты;
  •  вывод документа HTML, содержащего все элементы статьи с заданным наименованием (автор и наименование статьи должны быть выделены с помощью стилей).

Вариант 3-04

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

  •  вывод документа XML с корневым элементом  selected-processor для вывода элементов (для каждого компьютера должна быть задана марка материнской платы, марки дисководов жестких дисков и марка дисплея);
  •  вывод документа  XML с корневым элементом  selected-capacities, содержащий марки компьютеров, у которых суммарная емкость дисководов жестких дисков больше заданной;
  •  вывод документа HTML, содержащего все элементы компьютера заданной марки (наименования элементов компьютера должны быть выделены с помощью стилей).

Вариант 3-05

Создайте следующие запросы XQuery для документа XML, содержащего характеристики книг:

  •  вывод документа XML с корневым элементом  selected-author для наименования книги, издательства и года публикации для заданного автора;
  •  вывод документа  XML с корневым элементом  selected-publisher, содержащий авторов книг, наименование книги и год публикации для заданного издательства;
  •  вывод документа HTML, содержащего все элементы книги с заданным наименованием (наименования книги и автор должны быть выделены с помощью стилей).

Вариант 3-06

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

  •  вывод документа XML с корневым элементом  programming-specialty для авторов, наименования учебника и аннотации для учебников по программированию;
  •  вывод документа  XML с корневым элементом  selected-author, содержащий наименование учебника и аннотацию для заданного автора;
  •  вывод документа HTML, содержащего все элементы учебника с заданным наименованием (наименования учебника и автор должны быть выделены с помощью стилей).

Вариант 3-07

Создайте следующие запросы XQuery для документа XML, содержащего каталог товаров:

  •  вывод документа XML с корневым элементом  selected-specification для товаров, у которых заданная строка содержится в строке спецификации (для каждого товара выводится его наименование, спецификация и оптовая цена);
  •  вывод документа  XML с корневым элементом  selected-price, содержащего наименование, спецификацию, дополнительные сведения о товаре и розничную цену для товаров, у которых розничная цена меньше заданной;
  •  вывод документа HTML, содержащего все элементы товара с заданным наименованием (наименования элементов описания товара должны быть выделены с помощью стилей).

Вариант 3-08

Создайте следующие запросы XQuery для документа XML, содержащего задания на дипломные работы:

  •  вывод документа XML с корневым элементом  selected-themes для заданий, у которых заданная строка содержится в строке темы (для каждой темы выводится ее фамилия, имя и отчество студента, наименование и входные данные работы);
  •  вывод документа  XML с корневым элементом  selected-deadlines, содержащего наименование темы, фамилия, имя и отчество студента и  срок выполнения задания для заданий у которых срок выполнения меньше заданного;
  •  вывод документа HTML, содержащего все элементы задания для студента с заданной фамилией, именем и отчеством (фамилия, имя и отчество, а также наименование темы должны быть выделены с помощью стилей).

Вариант 3-09

Создайте следующие запросы XQuery для документа XML, содержащего справочник методов языка Java:

  •  вывод документа XML с корневым элементом  selected-first-letter для методов, начинающихся на заданную букву (для каждого метода выводится его имя, описание  и класс, в котором определен метод);
  •  вывод документа  XML с корневым элементом  static-methods, содержащего только статические методы (для каждого метода выводится его имя, класс, в котором определен метод и тип возвращаемого значения;
  •  вывод документа HTML, содержащего все элементы заданного метода (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-10

Создайте следующие запросы XQuery для документа XML, содержащего дипломные работы:

  •  вывод документа XML с корневым элементом  selected-specialty для дипломных работ по заданной специальности (для каждой работы выводится фамилия, имя и отчество студента, тема и задание  на работу);
  •  вывод документа  XML с корневым элементом  deadline-date, для дипломных работ, дата окончания выполнения которых меньше заданной (для каждой работы выводится фамилия, имя и отчество студента, тема и аннотация);
  •  вывод документа HTML, содержащего все элементы дипломной работы заданного студента (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-11

Создайте следующие запросы XQuery для документа XML, содержащего расписание занятий:

  •  вывод документа XML с корневым элементом  selected-subject для расписания по заданной специальности (выводится день недели, промежуток времени и группа);
  •  вывод документа  XML с корневым элементом  day-table, для расписания на заданный день недели (для каждого занятия выводится предмет, промежуток времени, группа и преподаватель);
  •   вывод документа HTML, содержащего расписание для заданного преподавателя:  выводится день недели, предмет, промежуток времени и группа (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-12

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

  •  вывод документа XML с корневым элементом  selected-specialty для рабочих программ по заданной специальности (выводится наименование дисциплины и общие сведения);
  •  вывод документа  XML с корневым элементом  selected-teacher для заданного преподавателя (для каждой программы выводится наименование, специальность, цели и задачи);
  •   вывод документа HTML, содержащий все элементы для заданной специальности (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-13

Создайте следующие запросы XQuery для документа XML, содержащего справочник полей языка Java:

  •  вывод документа XML с корневым элементом  static-fields для статических полей (выводится наименование поля, его краткое описание и класс, в котором определено поле);
  •  вывод документа  XML с корневым элементом  selected-class для заданных классов, в которых определены поля (для каждого поля выводится его имя и краткое описание);
  •  вывод документа HTML, содержащий все элементы для заданного имени поля специальности (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-14

Создайте следующие запросы XQuery для документа XML, содержащего расписание полетов самолетов:

  •  вывод документа XML с корневым элементом  selected-destinations для заданного аэропорта назначения (выводится номер рейса, тип самолета и дата полета);
  •  вывод документа  XML с корневым элементом  selected-date для полетов, у которых дата вылета меньше заданной  (для каждого полета выводится номер рейса, время вылета, время прилета и аэропорт назначения);
  •  вывод документа HTML, содержащий все элементы для номера рейса: тип самолета, дата вылета,  время вылета, время прилета и аэропорт назначения (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-15

Создайте следующие запросы XQuery для документа XML, содержащего научный отчет по теме:

  •  вывод документа XML с корневым элементом  selected-data для темы, списка авторов, аннотации отчета и даты окончания выполнения отчета;
  •  вывод документа  XML с корневым элементом  selected-authors для наименований разделов, в которых принимал участие заданный автор;
  •  вывод документа HTML, содержащий все элементы для заданного раздела работы  (заголовок раздела должен быть выделен с помощью стилей).

Вариант 3-16

Создайте следующие запросы XQuery для документа XML, содержащего справочник классов языка Java:

  •  вывод документа XML с корневым элементом  first-letter для классов, начинающихся на заданную букву (для каждого класса выводится его имя, описание, суперкласс  и модификаторы класса);
  •  вывод документа  XML с корневым элементом  selected-superclass, содержащего только классы заданного суперкласса (для каждого класса выводится его имя, описание и список прямых классов-потомков);
  •  вывод документа HTML, содержащего все элементы заданного класса (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-17

Создайте следующие запросы XQuery для документа XML, содержащего учебные программы дисциплин:

  •  вывод документа XML с корневым элементом  selected-specialty для дисциплин заданной специальности (для каждой дисциплины выводится ее имя, общие сведения, цели и задачи);
  •  вывод документа  XML с корневым элементом  selected-fio, содержащего описание дисциплины или дисциплин заданного преподавателя (для каждой дисциплины выводится ее наименование, специальность, цели и список тем);
  •  вывод документа HTML, содержащего все элементы для заданного наименования дисциплины (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-18

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

  •  вывод документа XML с корневым элементом  selected-contractant для контрактов заданного исполнителя (для каждого контракта выводится его заголовок, должность исполнителя и его зарплата);
  •  вывод документа  XML с корневым элементом  selected-salary, содержащего контракты, в которых зарплата исполнителя превышает заданную (для каждого контракта  выводится его наименование, ФИО заказчика и исполнителя, сроки выполнения работ по контракту и месячная зарплата);
  •  вывод документа HTML, содержащего все элементы для заданного контракта с заданным заголовком (наименования элементов должны быть выделены с помощью стилей).

 

Вариант 3-19

Создайте следующие запросы XQuery для документа XML, содержащего справочник интерфейсов языка Java:

  •  вывод документа XML с корневым элементом  selected-superinterfaces для интерфейсов с заданным суперинтерфейсом (для каждого интерфейса выводится его имя и краткие сведения);
  •  вывод документа  XML с корневым элементом  selected-protected, содержащего защищенные интерфейсы (для каждого интерфейса выводится его имя, краткие сведения, список суперинтерфейсов и  интерфейсов-потомков);
  •  вывод документа HTML, содержащего все элементы для заданного имени интерфейса (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-20

Создайте следующие запросы XQuery для документа XML, содержащего пакеты по протоколу TCP в Internet:

  •  вывод документа XML с корневым элементом  selected-destination для пакетов с заданным портом назначения (для каждого пакета выводится его порт источника,  порядковый номер и значения флажков);
  •  вывод документа  XML с корневым элементом  selected-data, содержащего в данных пакета заданную подстроку  (для каждого пакета выводится его порт источника,  порт назначения и порядковый номер);
  •  вывод документа HTML, содержащего все элементы пакета для заданного порядкового номера пакета (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-21

Создайте следующие запросы XQuery для документа XML, содержащего регистрационные карты научно-исследовательских тем:

  •  вывод документа XML с корневым элементом  selected-type для работ заданного типа основания (для каждой карты выводится ее номер регистрации, наименование организации и аннотация);
  •  вывод документа  XML с корневым элементом  selected-requestor, содержащего карты, в наименовании работы которых содержится заданная подстрока (для каждой карты  выводится ее номер регистрации, наименование работы и список наименований этапов работ);
  •  вывод документа HTML, содержащего все элементы для карты с заданным регистрационным номером (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-22

Создайте следующие запросы XQuery для документа XML, содержащего описание стандартной библиотеки функций языка C:

  •  вывод документа XML с корневым элементом  selected-partition для функций заданного раздела (для каждой функции выводится ее имя, описание и возвращаемое значение);
  •  вывод документа  XML с корневым элементом  selected-functions, содержащего функции, в имени которых содержится заданная подстрока (для каждой функции  выводится ее имя, список типов параметров и возвращаемое значение);
  •  вывод документа HTML, содержащего все элементы для функции с заданным именем (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-23

Создайте следующие запросы XQuery для документа XML, содержащего описание классов языка Java:

  •  вывод документа XML с корневым элементом  selected-interface для классов, реализующих заданный интерфейс (для каждого класса выводится его имя, описание, и список имен подклассов и методов);
  •  вывод документа  XML с корневым элементом  selected-description, содержащего только классы, у которых в описании содержится заданная подстрока (для каждого класса выводится его имя, описание, список интерфейсов и методов);
  •  вывод документа HTML, содержащего все элементы заданного класса (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-24

Создайте следующие запросы XQuery для документа XML, содержащего дейтаграммы протокола IP в Internet:

  •  вывод документа XML с корневым элементом  selected-source для дейтаграмм с заданным адресом источника назначения (для каждого пакета выводится его адрес назначения,  длина и значения флажков);
  •  вывод документа  XML с корневым элементом  selected-data, содержащего в данных пакета заданную подстроку  (для каждой дейтаграммы выводится ее адрес источника,  адрес назначения и относительная значимость);
  •  вывод документа HTML, содержащего все элементы дейтаграммы для заданной пары адреса источника и  адреса назначения (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-25

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

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

Вариант 3-26

Создайте следующие запросы XQuery для документа XML, содержащего описание методов языка Java:

  •  вывод документа XML с корневым элементом  selected-class для методов заданного класса (для каждого метода выводится его имя, описание класс, в котором определен метод);
  •  вывод документа  XML с корневым элементом  selected-date, содержащего в описании заданную подстроку (для каждого метода выводится его имя, описание и список типов параметров);
  •  вывод документа HTML, содержащего все элементы для метода с заданным именем (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-27

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

  •  вывод документа XML с корневым элементом  selected-manager для актов заданного руководителя (для каждого акта выводится его заголовок, дата подписания и преамбула);
  •  вывод документа  XML с корневым элементом  selected-total-salary, содержащего акты, в которых общая сумма выплат превышает заданную (для каждого контракта  выводится его наименование, ФИО руководителя и контрактанта и общая сумма выплат);
  •  вывод документа HTML, содержащего все элементы для заданного заголовка акта (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-28

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

  •  вывод документа XML с корневым элементом  selected-channel для заданного канала (для каждой передачи выводится ее время начала, наименование и описание);
  •  вывод документа  XML с корневым элементом  selected-time, содержащего передачи, у которых время начала превышает заданное (для каждой передачи  выводится ее канал, наименование и описание);
  •  вывод документа HTML, содержащего все элементы для заданного дня недели (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-29

Создайте следующие запросы XQuery для документа XML, содержащего описание интерфейсов языка Java:

  •  вывод документа XML с корневым элементом  selected-version для интерфейсов с заданной версией (для каждого интерфейса выводится его имя, краткое описание и значение модификатора);
  •  вывод документа  XML с корневым элементом  selected-static, содержащего в своем составе хотя бы один статический метод интерфейсы (для каждого интерфейса выводится его имя, краткие сведения, список статических методов и возвращаемых ими значений);
  •  вывод документа HTML, содержащего все элементы для заданного имени интерфейса (наименования элементов должны быть выделены с помощью стилей).

Вариант 3-30

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

  •  вывод документа XML с корневым элементом  selected-places для заданного места проведения соревнования (для каждого места проведения выводится дата и время начала проведения и две участвующие команды);
  •  вывод документа  XML с корневым элементом  selected-date, содержащего соревнования, у которых дата начала соревнования меньше заданного (для каждого соревнования  выводится его наименование, место проведения и   две участвующие команды);
  •  вывод документа HTML, содержащего все элементы для заданного наименования соревнования (наименования элементов должны быть выделены с помощью стилей).

5. Содержание отчета

В отчете должны быть представлены текст исходного документа XML, тексты запросов, тексты выходных документов XML и HTML, а также скриншот вывода  документа HTML в Web-браузере.  

6. Вопросы для самоконтроля

Для каких целей используется язык XPath, и каковы его основные характеристики?

Какие виды данных определены в XPath? Дайте краткую характеристику каждого типов данных для узлов.

Какие виды выражений определены в XPath? Дайте краткую характеристику каждого вида выражения.

Какие виды функций определены в базовой библиотеке XPath? Дайте краткую характеристику функций базовой библиотеки XPath.

Как определяется контекст в XPath?

Каков синтаксис путей с использованием оси поиска в XPath?

Из каких компонентов состоят шаги поиска? Дайте краткую характеристику каждого компонента.

Как с помощью осей в XPath определяется направление пути?

Какие правила проверки узлов определены в XPath?

Что такое предикаты в XPath и как они используются?

Как в XPath определяется сокращенный синтаксис шагов поиска?

Как выполняется поиск с использованием фильтров?

Какова структура запроса в XQuery? Дайте краткую характеристику каждой компоненте запроса.

Как определяется прямой конструктор в XQuery?

Как определяется вычисляемый конструктор в XQuery для различных типов узлов?

Как задается общий вид выражения FLWOR?

Как задаются операторы let, for и return в выражениях FLWOR?

Как задается оператор where в выражениях FLWOR?

Как задается оператор order by в выражениях FLWOR?

айл: file:///web/1/5fan/public_html/www/files/2/5fan_ru_13950_b41d70c27a05621f9c97f6c825a15a80.doc   Создан: 2008-03-02T09:37:00Z Модифицирован: 2008-03-02T09:37:00Z     Автор:


email-folder

ообщение 1

header

body

Поздравляю…

Поздравление

message

address

from

value

subject

to

value

Сообщение 2

header

body

Встречаемся…

Напоминание

message

address

from

value

subject

to

value

Сообщение 3

header

body

Я не смогу…

Отказ

message

address

from

value

subject

to

Сообщение 4

header

body

Когда ты…

Запрос

message

address

from

value

subject

to

value

Сообщение 5

header

body

Я могу…

Ответ

message

address

from

value

subject

to

value

self

preceding-sibling

ancestor

child

descendant

following-sibling

parent

attribute

value

preceding

following

– узел элемента

– узел комментария

– текстовый узел

– узел атрибута


 

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

43565. Анализ последствий управленческих решений на примере санатория «Черноморье» 3.64 MB
  Процесс принятия решения и его структура. Управленческие решения и их виды. Модель принятия управленческого решения менеджера. Исследование основных характеристик влияющих на процесс принятия управленческого решения.
43566. Разработка предложений по совершенствованию рынка труда в России в условиях кризиса 93.85 KB
  Актуальность темы курсовой работы усиливается и тем обстоятельством, что субъекты российского рынка труда еще только накапливают опыт функционирования в новых экономических условиях. Функционирование рынка труда сопряжено со множеством сложностей, столкновений интересов различных социальных групп.
43567. Внешнее измерение социальной политики Европейского Союза и проблема расширения 484.28 KB
  Этапы формирования социальной политики Европейского Союза 12 1. Этапы развития социальной политики Европейского Союза 17 1. Политика в области занятости образования и в социальной сфере 22 1. Особенности функционирования механизма социальной политики Европейского Союза на современном этапе.
43568. Проблемы правового регулирования и перспективы развития законодательства о наследовании 323 KB
  Независимо от социального развития общества, экономической или политической ситуации наследственные отношения были, есть, и будут актуальны, так как в любом государстве неизбежны две вещи: смерть и налоги. В связи с вступлением в силу третьей части Гражданского Кодекса Российской Федерации, вопросы наследования стали особо интересны.
43569. Прекращение трудового договора по инициативе работодателя по основаниям, не связанным с виной работника, анализ судебной практики и выработка на этой основе предложений по совершенствованию норм права 107.13 KB
  Принципы прекращения трудовых отношений по инициативе работодателя по основаниям не связанным с виной работника. Основания расторжения трудового договора по инициативе работодателя не связанные с виной работника. Расторжение трудового договора в связи с несоответствием работника занимаемой должности вследствие недостаточной квалификации подтвержденной результатами аттестации....
43570. Общественные отношения, возникающие в процессе исполнения (отбывания) наказания в виде пожизненного лишения свободы и применения к осужденным основных средств исправления 145.86 KB
  Введение пожизненного лишения свободы Указом Президента Российской Федерации от 17 декабря 1992 г. Российская Федерация была одним из первых государств на территории бывшего Советского Союза которая в своём Уголовном кодексе предусмотрела такое наказание как пожизненное лишение свободы.3 многие вопросы связанные с исполнением пожизненного лишения свободы нашли законодательное урегулирование хотя как показала практика отдельные аспекты организации его исполнения попрежнему вызывают споры и сомнения. 57 УК РФ пожизненное лишение свободы...
43573. Отношения «педагог – воспитанник» в образовательном процессе 408 KB
  Педагогическое общение – это профессиональное общение преподавателя с учащимися на уроке и вне его имеющее определённые педагогические функции и направленное на создание благоприятного психологического климата, а так же на другого рода психологическую оптимизацию учебной деятельности и отношений между педагогом и учащимися внутри ученического коллектива.