由于问题“如何在 XQuery 中使用或实现数组?” 被认为是通用的(因此出现在有关该主题的搜索结果中),我想添加一个通用答案以供将来参考(使其成为社区 Wiki,以便其他人可以扩展):
正如 Christian Grün 已经暗示的那样,在XQuery 3.1中, XQuery 获得了原生数组数据类型,它是函数数据类型的子类型。
由于数组是“值的有序列表”并且 XPath/XQuery 序列也是,因此可能出现的第一个问题是:“有什么区别?” 答案很简单:一个序列不能包含另一个序列。所有序列都会自动展平。不是这样的数组,可以是数组的数组。就像序列一样,XQuery 中的数组也可以混合任何其他数据类型。
本机 XQuery 数组数据类型可以用两种方式之一表示: As[]
或 via array {}
。不同之处在于,在使用前一个构造函数时,逗号被视为“硬”逗号,这意味着以下数组由两个成员组成:
[ ("apples", "oranges"), "plums" ]
而以下将由三名成员组成:
array { ("apples", "oranges"), "plums" }
这意味着,花括号内的数组表达式首先被解析为一个平面序列,然后被成员化为一个数组。
由于 Array 是函数的子类型,因此可以将数组视为匿名函数,它采用单个参数,即数字索引。为了获得数组的第三个成员,名为 $foo,我们可以这样写:
$foo(3)
如果一个数组包含另一个数组作为成员,您可以将函数调用链接在一起,如下所示:
$foo(3)(5)
除了数组数据类型之外,还添加了特殊运算符,可以轻松查找数组的值。一个这样的运算符(也被新的 Map 数据类型使用)是问号后跟一个整数(或计算结果为零或多个整数的表达式)。
$foo?(3)
将再次返回数组中的第三个成员,而
$foo?(3, 6)
将返回成员 3 和 6。
使用文字整数时,可以省略括号。但是,需要使用括号来从动态表达式中形成查找索引,例如:
$foo?(3 to 6)
在这里,括号中的表达式被评估为一个整数序列,因此该表达式将返回从索引位置 3 到索引位置 6的所有成员的序列。
星号*
用作通配符运算符。表达方式
$foo?*
将返回数组中所有项目的序列。同样,链接是可能的:
$foo?3?5
匹配前面的例子$foo(3)(5)
。
更深入的信息可以在官方规范中找到:XML Path Language (XPath) 3.1 / 3.11.2 Arrays
此外,还实现了一组特定于数组的新函数。命名空间中的这些函数resinde http://www.w3.org/2005/xpath-functions/array
,通常以前缀为前缀array
并且可以在此处找到引用:XPath and XQuery Functions and Operators 3.1 / 17.3 Functions that Operate on Arrays