XQuery序列

XQuery序列,xquery,sequences,Xquery,Sequences,鉴于: 声明变量$seq:=( ((‘foo’、‘bar’、(‘baz’)) ); {($seq[()[1][1]='foo'])[2][1]} 我期望: declare variable $seq := ( (('foo', 'bar'), ('baz')) ); <result>{ ($seq[(.)[1][1] = 'foo'])[2][1] }</result> baz 但是你可以得到: <result>baz</result&

鉴于:

声明变量$seq:=(
((‘foo’、‘bar’、(‘baz’))
);
{($seq[()[1][1]='foo'])[2][1]}
我期望:

declare variable $seq :=  (
  (('foo', 'bar'), ('baz'))  
);

<result>{ ($seq[(.)[1][1] = 'foo'])[2][1] }</result>
baz
但是你可以得到:

<result>baz</result>


为什么?

在XQuery数组中没有维度,所以
(('foo','bar'),('baz'))
('foo','bar','baz')没有区别。


($seq[()[1][1]='foo'])
$seq[.='foo']
=>
文本{'foo'}
相同。这被视为长度为1的序列。所以
(text{'foo'})[1]
=>
text{'foo'}
,但是
(text{'foo'})[2]
显然是
()
在XQuery数组中没有维度,所以
('foo',bar'),('baz')
('foo',bar',baz')没有区别


($seq[()[1][1]='foo'])
$seq[.='foo']
=>
文本{'foo'}
相同。这被视为长度为1的序列。所以
(text{'foo'})[1]
=>
text{'foo'}
,但是
(text{'foo'})[2]
显然是
()

所有的现象都是相反的,尽管XQuery不是Lisp的方言。(是的,我知道;如果是这样的话,世界上有些人会更幸福。)

XQuery序列不会嵌套,当给定似乎建议嵌套的表达式时(如本查询中的表达式),XQuery计算器会将序列展平。因此,在您的示例中,$seq的值是('foo','bar','baz')

表达式
$seq[()[1][1]='foo']
可以简化为
$seq[.='foo']
并计算为序列
'foo'

紧跟其后的谓词
[2]
[1]
首先询问该序列中的第二项(保证生成长度为零或一的序列),然后询问结果序列中的第一项(这里保证没有任何效果)。因为实际上序列
'foo'
是一个单例,所以没有第二个成员

因此,
($seq[()[1][1]='foo'])[2][1]
的值是空序列,整个查询的值是一个空的
结果
元素


在XQuery中实现嵌套结构的最简单方法是使用XML;XML在嵌套结构方面相当出色,XQuery在XML方面也非常出色。

尽管如此,XQuery并不是Lisp的方言。(是的,我知道;如果是这样的话,世界上有些人会更幸福。)

XQuery序列不会嵌套,当给定似乎建议嵌套的表达式时(如本查询中的表达式),XQuery计算器会将序列展平。因此,在您的示例中,$seq的值是('foo','bar','baz')

表达式
$seq[()[1][1]='foo']
可以简化为
$seq[.='foo']
并计算为序列
'foo'

紧跟其后的谓词
[2]
[1]
首先询问该序列中的第二项(保证生成长度为零或一的序列),然后询问结果序列中的第一项(这里保证没有任何效果)。因为实际上序列
'foo'
是一个单例,所以没有第二个成员

因此,
($seq[()[1][1]='foo'])[2][1]
的值是空序列,整个查询的值是一个空的
结果
元素


在XQuery中实现嵌套结构的最简单方法是使用XML;XML在嵌套结构方面相当出色,XQuery在XML方面也非常出色。

谢谢。有没有办法在XQuery中实现多维数组/映射?@Ben是的,有点。Marklogic(我认为BaseX)有一个map:map数据类型,它是一个键值对哈希表数据结构,可以序列化为XML,您可以创建映射的映射。否则,我认为您必须使用XML来创建多维数组。谢谢。有没有办法在XQuery中实现多维数组/映射?@Ben是的,有点。Marklogic(我认为BaseX)有一个map:map数据类型,它是一个键值对哈希表数据结构,可以序列化为XML,您可以创建映射的映射。否则,我认为您必须使用XML来创建多维数组;我使用的大多数XQuery处理器通常都会发出格式良好的XML。你是说你得到了
?这似乎不太可能;我使用的大多数XQuery处理器通常都会发出格式良好的XML。你是说你得到了
</result>