XPath:根路径表达式开头的«/»运算符完全匹配?

时间:2015-12-22 20:39:10

标签: xpath saxon basex

在目录中,我有几个这样的XML文件:

档案#1:<root myAtt="one"/>

文件#2:<root myAtt="two"/>

我想选择第一个文件。为此,我使用以下查询(假设该目录名为“myDocs”):

collection('myDocs')[/root/@myAtt = 'one']

(我知道我可以使用doc()来选择感兴趣的文档。但这个例子只是我所面临的真实情况的简化版本,我必须使用它来收集从数据库中提取。)

如果我在Saxon-HE 9.6上运行此查询,我会得到我期望的结果:<root myAtt="one"/>。但是如果我在BaseX 8.3上运行相同的查询,我会惊讶地得到:<root myAtt="one"/><root myAtt="two"/>。随之而来的是混乱。

显然,谓词中的路径表达式的前导/(根据Kay博士在XSLT 2.0和XPath 2.0第4版中的“根路径表达式”)在实现中的处理方式不同。

在这种情况下,/应该选择包含上下文节点的树的文档节点。这就是撒克逊所做的。

但是在BaseX中,/似乎选择了谓词过滤的文档节点序列。这将解释(如果我说得对),鉴于一般比较运算符=的特殊行为,谓词将评估所有文档的 true (总是至少有一个项目)在结果序列中等于'one')。

那么,/运算符在根目录路径表达式中的行为依赖于实现吗?

1 个答案:

答案 0 :(得分:3)

感谢您的观察。这是bug in BaseX,将在BaseX 8.4中修复(此修复程序也可在latest snapshot中找到)。

以下查询是等效的,因为当前上下文项(作为谓词中路径的输入)将是当前的根节点:

12345678 => 1234 5678