XQuery序列

时间:2013-08-14 23:23:31

标签: xquery sequences

假设:

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

<result>{ ($seq[(.)[1][1] = 'foo'])[2][1] }</result>

我期待:

<result>baz</result>

但是得到:

</result>

为什么?

2 个答案:

答案 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]显然是()