
- •Лекция 4-05
- •Раздел 5. Обработка документов xml
- •Тема 5.1. Вспомогательные языки xml
- •Раздел 5. Обработка документовXml Тема 5.1. Вспомогательные языки xml
- •5.1.1. Язык xPath
- •5.1.1.1. Назначение и спецификации языка xPath
- •5.1.1.2. Типы данных в языках xPath и xQuery
- •5.1.1.3. ВыраженияXPath
- •5.1.1.3.1. Переменные и литералы
- •5.1.1.3.2. Числовые выражения
- •5.1.1.3.3. Выражения отношения
- •5.1.1.3.4. Булевские выражения
- •5.1.1.3.5. Выражения для типов последовательности
- •5.1.1.3.6. Условные выражения
- •5.1.1.3.7. Последовательности
- •5.1.1.3.8. Циклы
- •5.1.1.3.9. Квантификаторы
- •5.1.1.3.10. Выражения для последовательностей узлов
- •5.1.1.3.11. Приоритет операций
- •5.1.1.4. ФункцииXPathи xQuery
- •5.1.1.4.1. Функции-конструкторы
- •5.1.1.4.2. Числовые операторы и функции
- •5.1.1.4.3. Строковые функции
- •5.1.1.4.3.1. Функции сборки-разборки строк
- •5.1.1.4.3.2. Функции сравнения строк
- •5.1.1.4.3.3. Функции строковых значений
- •5.1.1.4.3.4. Функции поиска соответствия в строках
- •5.1.1.4.3.5. Функции с использованием регулярных выражений
- •5.1.1.4.4. Булевские функции и операторы
- •5.1.1.4.5. Функции и операторы для продолжительности, дат и времени
- •5.1.1.4.5.1. Операторы сравнения
- •5.1.1.4.5.2. Функции извлечения компонент
- •5.1.1.4.5.3. Арифметические операторы для продолжительности, дат и времени
- •5.1.1.4.6. Функции для узлов
- •5.1.1.4.7. Функции и операторы для последовательностей
- •5.1.1.4.7.1. Общие функции и операторы
- •5.1.1.4.7.2. Функции проверки количества элементов в последовательности
- •5.1.1.4.7.3. Функции и операторы для операций с множествами
- •5.1.1.4.7.4. Агрегатные функции
- •5.1.1.4.7.5. Операторы и функции, генерирующие последовательности
- •5.1.1.4.8. Контекстные функции
- •5.1.1.5. Выражения пути в xPath
- •5.1.1.5.1. Синтаксис выражений пути
- •5.1.1.5.2. Шаги с использованием оси поиска
- •5.1.1.5.2.2. Проверка узла
- •5.1.1.5.2.3. Предикаты
- •5.1.1.5.2.4. Сокращенный синтаксис выражений с использованием путей поиска
- •5.1.1.5.3. Шаги с использованием фильтров
- •5.1.2. Язык xQuery
- •5.1.2.1. Структура запроса xQuery
- •5.1.2.1.1. Главный модуль
- •5.1.2.1.1.1. Объявления параметров настройки
- •5.1.2.1.1.2. Объявления переменных
- •5.1.2.1.1.3. Объявления функций
- •5.1.2.1.1.4. Объявления опций
- •5.1.2.1.1.5. Операторы импорта
- •5.1.2.1.1.6. Объявления пространства имен
- •5.1.2.1.2. Библиотечный модуль
- •5.1.2.1.3. Комментарии
- •5.1.2.2. КонструкторыXQuery
- •5.1.2.2.1. Прямой конструктор
- •5.1.2.2.2. Вычисляемый конструктор
- •5.1.2.2.2.1. Вычисляемые конструкторы элемента и атрибута
- •5.1.2.2.2.2. Вычисляемый конструктор документа
- •5.1.2.2.2.3. Вычисляемый конструктор текстового узла
- •5.1.2.2.2.4. Вычисляемый конструктор комментария
- •5.1.2.2.2.5. Вычисляемый конструктор инструкции по обработке
- •5.1.2.3. Выражения flwor
- •5.1.2.3.1. Операторыfor,letиreturn
- •5.1.2.3.2. Операторwhere
- •5.1.2.3.3. Операторorderby
- •5.1.3. ЯзыкXLink
- •5.1.3.1. Глобальные атрибуты языкаXLink
- •5.1.3.2. Простые ссылки
- •5.1.3.3. Расширенные ссылки
- •5.1.3.4. Внешние ссылки
- •5.1.3.5. Задание базовогоUrIдля документаXml
5.1.2.1.2. Библиотечный модуль
Модуль, не содержащий тела запроса, называется библиотечным модулем. Первым оператором библиотечного модуля является оператор объявления модуля
module namespaceпространство-имен="целевое-URI";
В параметре задается префикс целевого пространства имен в модуле, а в его значении "целевое-URI" задается идентификатор ресурса для целевого пространства имен.
Имя каждой переменной и функции, объявленной в модуле, должно быть тем же самым, что и пространство-именв операторе объявления модуля.
Пример задания оператора объявления модуля:
module namespace math="http://example.org/math-functions";– объявляет модуль с целевым пространством имен с префиксомmathпо адресу"http://example.org/math-functions".
5.1.2.1.3. Комментарии
В прологе или теле запроса могут быть заданы комментарии. Комментарии, как и в программировании, служат только для пояснения и не влияют на обработку запроса.
Комментарий начинается с символов "" и заканчивается символами "". Комментарии в XQuery могут быть вложенными.
Пример комментария:
(: Определение переменной$var :)
5.1.2.2. КонструкторыXQuery
В языке XQueryопределены специальные выражения – конструкторы, создающие структуры XML в формируемом запросе. Конструкторы определены для узлов документов, элементов, атрибутов, текстовых узлов и узлов инструкций для обработки. ЯзыкXQueryобеспечивает два вида конструкторов:
прямой конструктор (direct constructor);
вычисляемый конструктор (computed constructor).
5.1.2.2.1. Прямой конструктор
В прямом конструкторе элемента имя создаваемого элемента является константой. В этом случае элемент создается в соответствии с правилами синтаксиса XML и может содержать вложенные элементы.
В прямой конструктор могут включаться выражения, заключенные в фигурные скобки "{" и "}". При создании элемента эти выражения будут вычислены и заменены своим результатом.
Если символы "{" и "}" используются в конструкторе как обычные символы, они должны быть удвоены, т.е. заменены символами "{{" и "}}". Можно также использовать ссылки на символы:{для символа "{" и}для символа "}".
Результатом действия конструктора является новый узел-элемент.
Начальный тег конструктора и вложенных элементов может содержать один и более атрибутов. Имя атрибута должно быть типа 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>