Поскольку вопрос Как использовать или реализовать массивы в XQuery? считается общим (и, таким образом, отображается в результатах поиска по этой теме), я хотел бы добавить общий ответ для дальнейшего использования (сделав его вики сообщества, чтобы другие могли расширяться):
Как уже намекал Кристиан Грюн, в XQuery 3.1 XQuery получил собственный тип данных массива, который является подтипом типа данных функции.
Поскольку массив — это «упорядоченный список значений», как и последовательность XPath/XQuery, первый вопрос, который может возникнуть, таков: в чем разница? Ответ прост: последовательность не может содержать другую последовательность. Все последовательности автоматически выравниваются. Не так массив, который может быть массивом массивов. Точно так же, как последовательности, массивы в XQuery также могут иметь любое сочетание любых других типов данных.
Собственный тип данных массива XQuery может быть выражен одним из двух способов: как []
или через array {}
. Разница в том, что при использовании прежнего конструктора запятая считается «жесткой» запятой, что означает, что следующий массив состоит из двух элементов:
[ ("apples", "oranges"), "plums" ]
в то время как следующее будет состоять из трех членов:
array { ("apples", "oranges"), "plums" }
это означает, что выражение массива в фигурных скобках сначала преобразуется в плоскую последовательность, а затем включается в массив.
Поскольку массив является подтипом функции, массив можно рассматривать как анонимную функцию, которая принимает единственный параметр — числовой индекс. Таким образом, чтобы получить третий член массива с именем $foo, мы можем написать:
$foo(3)
Если массив содержит другой массив в качестве члена, вы можете связать вызовы функций вместе, как в:
$foo(3)(5)
Наряду с типом данных массива были добавлены специальные операторы, упрощающие поиск значений массива. Одним из таких операторов (также используемым новым типом данных Map) является вопросительный знак, за которым следует целое число (или выражение, результатом которого является ноль или более целых чисел).
$foo?(3)
снова вернет третий член массива, а
$foo?(3, 6)
вернет членов 3 и 6.
Скобки можно опускать при работе с литеральными целыми числами. Однако круглые скобки необходимы для формирования индекса поиска из динамического выражения, например:
$foo?(3 to 6)
здесь выражение в скобках оценивается как последовательность целых чисел, и, таким образом, выражение будет возвращать последовательность элементов all от позиции индекса 3 до позиции индекса 6.
Звездочка *
используется как оператор подстановки. Выражение
$foo?*
вернет последовательность всех элементов массива. Опять же, цепочка возможна:
$foo?3?5
соответствует предыдущему примеру $foo(3)(5)
.
Более подробную информацию можно найти в официальной спецификации: XML Path Language ( XPath) 3.1 / 3.11.2 Массивы
Также был реализован новый набор функций, специфичных для массивов. Эти функции находятся в пространстве имен http://www.w3.org/2005/xpath-functions/array
, которое обычно имеет префикс array
, и ссылки на них можно найти здесь: Функции и операторы XPath и XQuery 3.1 / 17.3 Функции, работающие с массивами
person
Community
schedule
28.07.2020