假设:
declare variable $seq := (
(('foo', 'bar'), ('baz'))
);
<result>{ ($seq[(.)[1][1] = 'foo'])[2][1] }</result>
我期待:
<result>baz</result>
但是得到:
</result>
为什么?
答案 0 :(得分:3)
尽管如此,XQuery并不是Lisp的一种方言。 (是的,我知道;如果是的话,世上有些人会更快乐。)
XQuery序列不会嵌套,并且当给定的表达式似乎建议嵌套时(如此查询中的那些),XQuery评估器会将序列展平。所以在你的例子中,$ seq的值是('foo','bar','baz')。
表达式$seq[(.)[1][1] = 'foo']
可以简化为$seq[. = 'foo']
并计算为序列'foo'
。
紧随其后的谓词[2]
和[1]
首先询问此序列中的第二项(保证生成长度为零或一的序列),然后对结果中的第一项求问序列(这里保证完全没有效果)。事实上,序列'foo'
是一个单身,但没有第二个成员。
($seq[(.)[1][1] = 'foo'])[2][1]
的值因此是空序列,整个查询的值是空的result
元素。
在XQuery中实现嵌套结构的最简单方法是使用XML; XML在嵌套结构方面表现出色,而XQuery在XML方面非常出色。
答案 1 :(得分:2)
在XQuery数组中没有维度,因此(('foo', 'bar'), ('baz'))
与('foo', 'bar', 'baz')
没有区别。
($seq[(.)[1][1] = 'foo'])
与$seq[. = 'foo']
=&gt;相同text{'foo'}
。这被视为长度为1的序列。因此(text{'foo'})[1]
=&gt; text{'foo'}
,但(text{'foo'})[2]
显然是()
。