2

这是我的问题的简短版本。

在 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也会失败的意外行为。这只会增加我的困惑。

4

1 回答 1

0

很可能是一个错误。在线 XQuery 测试器http://www.xpathtester.com/xquery返回

<?xml version="1.0" encoding="UTF-8"?>
<element>
        element data
    </element>

作为两个脚本的结果(doc(...)删除了部分)。

于 2016-01-04T22:03:01.107 回答