Операторы for, let и return
Операторы for и let имеют следующий вид:
for $переменная-1 at $ переменная-цикла-1 as тип-1 in выражение-1,
$переменная-2 at $ переменная-цикла-2 as тип-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.
Примеры задания операторов 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>
Будут выведены следующие сообщения:
Дата добавления: 2015-03-19; просмотров: 693;