在目录中,我有几个这样的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')。
那么,/
运算符在根目录路径表达式中的行为依赖于实现吗?
答案 0 :(得分:3)
感谢您的观察。这是bug in BaseX,将在BaseX 8.4中修复(此修复程序也可在latest snapshot中找到)。
以下查询是等效的,因为当前上下文项(作为谓词中路径的输入)将是当前的根节点:
12345678 => 1234 5678