这是我的问题的简短版本。
在 FLOWR 表达式中使用嵌套 for 循环时,从内部循环返回变量的行为与预期相同,但从外部循环返回变量意外返回空标记。
这是我的问题的更长版本。
我最近开始学习 XQuery。我一直在 Mac OS X 10.10.4 (Yosemite) 上使用 XQilla 命令行工具来执行我的 XQuery 脚本。特别是我尝试了使用 MacPorts 包管理器安装的 XQilla 版本 2.3.0_2 以及我从源代码手动安装的 XQilla 版本 2.3.2。
在尝试各种 XPath 和 FLWOR 表达式时,我遇到了一个意想不到的行为,我已将其范围缩小到我将在此处介绍的简化示例。该示例由一个 XML 数据文件和两个版本的简单 XQuery 组成;第一个查询按预期工作,但第二个查询没有。
这是我的 XML 数据文件 ( test.xml
):
<elements>
<element>
element data
</element>
</elements>
这是我的第一个 XQuery 脚本 ( test_1.xq
):
for $e1 in doc("test.xml")//element
for $e2 in doc("test.xml")//element
return $e1
这是我的第二个 XQuery 脚本 ( test_2.xq
):
for $e1 in doc("test.xml")//element
for $e2 in doc("test.xml")//element
return $e2
两个查询都包含相同的冗余嵌套 for 循环,但第一个查询从外部(即第一个)for 循环返回变量,第二个查询从内部(即第二个)for 循环返回变量。我预计这两个查询通常具有相似的输出,并且此特定数据文件的输出相同,但情况似乎并非如此。
这是一个示例 shell 会话:
$ xqilla test_1.xq
<element>
element data
</element>
$ xqilla test_2.xq
<element/>
所以从外循环返回变量只会产生空标签;这是出乎意料的。
作为健全性检查,我尝试了第三种变体(test_3.xq
):
for $e1 in doc("test.xml")//element
for $e2 in doc("test.xml")//element
where $e1=$e2
return $e2
当我执行第三个查询时,我得到:
$ xqilla test_3.xq
<element>
element data
</element>
我原本希望这个查询能够正常工作,但鉴于test_2.xq
我认为这test_3.xq
也会失败的意外行为。这只会增加我的困惑。