Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-05.doc
Скачиваний:
6
Добавлен:
12.05.2015
Размер:
645.12 Кб
Скачать

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>

Будут выведены следующие сообщения:

Соседние файлы в папке Лекции