Выражение запроса FLWOR
Запрос к документу XML, как и все в языке XQuery, записывается в виде выражения, которое в простейшем случае выглядит так:
let $n := ( "Петр", "Иванов")
return ( $n )
Здесь после знака присваивания := может стоять произвольное выражение, Оно вычисляется, и переменная $n получает его значение, в данном случае — "Петр Иванов", которое подставляется в возвращаемый запросом элемент
Петр Иванов
В операторе return можно записать любое выражение, хотя чаще всего здесь располагается конструктор.
Вторая форма запроса начинается со слова for. Она выглядит и выполняется как цикл языка XPath 2,0. Вот простейший пример:
for $n in ( "Петр", "Иванов")
return ( $n )
Здесь переменная $n последовательно принимает значения узлов и/или атомарных значений, входящих в результат вычисления выражения, стоящего после знака операции in. Для каждого значения переменной $n выполняется оператор return, и запрос возвращает несколько элементов:
Петр
Иванов
Переменная заголовка получает тип своего значения, но этот тип можно преобразовать, указав новый тип после слова as. Новый тип должен быть совместим со старым.
for $n as xs:string in ( "Петр", "Иванов")
let $n as xs:string:= ( "Петр", "Иванов")
У заголовка for есть одна дополнительная возможность, которой нет у заголовка let. Параллельно переменной заголовка можно определить еще одну целочисленную переменную типа xs: integer, которая будет принимать значения 1, 2, 3, ..., отсчитывая повторения цикла. Для создания порядковой переменной надо записать ее после слова at:
for $n at $i in ( "Петр", "Иванов")
Этот заголовок задает по два значения переменных $n и $i:
($n = "Петр", $i=1)
($n = "Иванов", $i = 2)
Итак, заголовок запроса принимает две формы: let и for. В заголовке их можно совместить. Такое совмещение заголовков let и for допускается в любом порядке и в любом количестве. Можно записать несколько заголовков for подряд или перемежать их заголовками let. Такие вложения можно записать в кратной форме.
Например, запрос:
for $i in (10, 20), $j in (1 to 3)
return ( <$i, ",", $j) )
даст в результате элементы:
10,1х>
<х>10,2х>
<х>10,3х>
<х>20,1/х>
<х>20,2х>
<х>20,3х>
Такая же запись возможна и в запросе с заголовком let. Попытка применить ее в предыдущем примере:
let $i := (10, 20), $j := (1 to 3)
return ( ($i, ",", $j) }
приведет к следующему результату:
10 20,1 2 3
В общем случае в запросе может быть несколько заголовков let и for, а и каждом заголовке можно записать несколько переменных. Каждый заголовок let и каждое выполнение заголовка for вместе формируют кортеж — упорядоченный набор из одной или нескольких переменных. Все выполнения всех заголовков for приводят к образованию потока кортежей. Для каждого кортежа вычисляется выражение, расположенное в операторе return.
Кортеж, сформированный в заголовках запроса, может быть пропущен через фильтр, образованный выражением, записанным в операторе where запроса. Кортеж проходит через фильтр к оператору return, если выражение оператора where для него истинно. Например:
for $x in /count/incr
where $x > 0
return $х
Поток кортежей, прошедших через фильтр, можно отсортировать, задав порядок сортировки оператором order by, в котором записывается одно или несколько выражений через запятую. Каждое выражение может завершаться словом ascending (принимается по умолчанию) или словом descending, задающим порядок сортировки: по возрастанию или по убыванию значений переменных соответственно. В результате вычисления выражений определяются переменные, по которым производится сортировка.
Итак, запрос в полном виде состоит из пяти частей "for-let-where-order by-return", откуда и произошло его сокращенное название FLWOR.
Хотя бы один из заголовков for и let должен присутствовать в запросе обязательно. Заголовков может быть несколько, и они могут встречаться в любом порядке. Части where и order by необязательны, они могут встретиться только по одному разу в указанном порядке. Заключительная часть return обязательна, она только одна. В части return может встретиться еще один запрос FLWOR, а в нем другой, таким образом можно сделать вложенные запросы.
Достарыңызбен бөлісу: |