
- •Лекция 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.3. Выражения flwor
Запрос к документу XML имеет одну из следующих общих форм:
оператор-for
оператор-let
оператор-where
оператор-order-by
returnвыражение
По первым буквам используемых в выражении операторов (for,let,where,order byиreturn) эти выражения были названывыражениями FLWOR.
Обязательный оператор returnконструирует результат выполнениявыраженияи возвращает его как результат выполнения всего выражения FLWOR.
5.1.2.3.1. Операторыfor,letиreturn
Операторы forиletимеют следующий вид:
for$переменная-1at$ переменная-цикла-1asтип-1inвыражение-1,
$переменная-2at$ переменная-цикла-2asтип-2inвыражение-2,…
let$переменная-1asтип-1 := выражение-1,
$переменная-2asтип-2 := выражение-2,…
Операторы forиletгенерируют упорядоченную последовательность узлов и/или атомарных значений. В выражении может быть более одного оператораforи/илиlet, но обязательно должен быть хотя бы один из них. Каждое выполнение операторовforиletформируюткортеж(turple) – упорядоченный набор из одной или нескольких переменных.
В простом случае в операторе forопределена одна переменная и заданное для нее выражение (значение этого выражения называетсясвязывающей последовательностьюдля переменной). Операторforвыполняет итерацию по элементам связывающей последовательности. Если же в оператореforопределены несколько переменных, итерация выполнятся для каждой переменной по элементам ее связывающей последовательности. Результатом этих операций являетсяпоток кортежей(turplestream), содержащий один кортеж для каждой комбинации значений в соответствующих связывающих последовательностях.
Оператор letтакже может содержать одну и более переменных с заданными для каждой из них выражениями. Но, в отличие от оператораfor, этот оператор связывает каждую переменную с результатом связанного с ней выражения без итерации. Связи переменных, генерируемые операторамиlet, добавляются к связанным кортежам, генерируемым операторамиfor. Если в выражении нет операторовfor, операторыletгенерируют один кортеж, содержащий все связанные переменные.
Для каждой переменной, задаваемой в операторах forиlet, может быть определен (после ключевого словаas) тип переменной. Тип результата вычисления выражения для переменной должен совпадать с заданным типом переменной.
В операторе forкаждая переменная может иметь заданную для нее (после ключевого словаat) индексную переменную, которая имеет типxs:integer. При итерации переменных по элементам связывающей последовательности, индексная переменная выполняет итерацию над целыми, представляющими индексы этих элементов в связывающей последовательности, начиная с 1. Расширенное имяQNameдля индексной переменной должно отличаться от расширенного имениQNameпеременной, для которой задана индексная переменная.
Обязательный оператор returnвычисляетвыражение(обычно конструктор) для каждого кортежа в потоке кортежей, затем результаты этих вычислений сцепляются друг с другом, образуя результат выполнения всего выражения FLWOR.
Примеры задания операторов for, let и return:
Запрос на обработку использованием вычисляемых конструкторов имеет следующий вид:
1. Вывод сообщений, содержащих комментарий с номером сообщения в почтовом ящике, а также адресата и тему сообщения для сообщений в документе email.xml:
xquery version "1.0";
for $name at $i in doc("email.xml")//message
return
<message>
{comment{fn:concat("Сообщение ", $i)}}
{$name/header/address/to}
{$name/header/subject}
</message>
Будут выведены следующие сообщения: