XPath:根路径表达式开头的 «/» 运算符与什么完全匹配?
XPath: What does the «/» operator at the beginning of a rooted path expression exactly match?
在一个目录中,我有几个这样的 XML 文件:
文件 #1:<root myAtt="one"/>
文件 #2:<root myAtt="two"/>
我要select第一个文件。为此,我使用以下查询(假设目录名为 "myDocs"):
collection('myDocs')[/root/@myAtt = 'one']
(我知道我可以使用 doc()
到 select 感兴趣的文档。但是这个例子只是我面临的真实情况的简化版本,在我必须使用从数据库中提取的集合。)
如果我在 Saxon-HE 9.6 上 运行 这个查询,我会得到我期望的结果:<root myAtt="one"/>
。但是如果我 运行 在 BaseX 8.3 上执行相同的查询,我会惊讶地得到:<root myAtt="one"/><root myAtt="two"/>
。随之而来的是混乱。
显然,谓词内部路径表达式的前导 /
(根据 Kay 博士在 XSLT 2.0 和 XPath 2.0 第 4 版中的 "rooted path expression")在不同实现中的处理方式不同。
在这种情况下,/
应该是 select 包含上下文节点的树的文档节点。这就是撒克逊人所做的。
但在 BaseX 中,/
似乎 select 文档节点序列被谓词过滤。这将解释(如果我没弄错的话)谓词对所有文档的计算结果为 true,考虑到通用比较运算符 =
的特殊行为(总是在结果序列中至少有一项等于 'one').
那么,/
运算符在根路径表达式中的行为是否依赖于实现?
感谢关注。这是 bug in BaseX, which will be fixed in BaseX 8.4 (the fix is also available in the latest snapshot).
下面的查询是等价的,因为 当前上下文项 用作谓词中路径的输入,无论如何都将是当前根节点:
collection('myDocs')[root/@myAtt = 'one']
在一个目录中,我有几个这样的 XML 文件:
文件 #1:<root myAtt="one"/>
文件 #2:<root myAtt="two"/>
我要select第一个文件。为此,我使用以下查询(假设目录名为 "myDocs"):
collection('myDocs')[/root/@myAtt = 'one']
(我知道我可以使用 doc()
到 select 感兴趣的文档。但是这个例子只是我面临的真实情况的简化版本,在我必须使用从数据库中提取的集合。)
如果我在 Saxon-HE 9.6 上 运行 这个查询,我会得到我期望的结果:<root myAtt="one"/>
。但是如果我 运行 在 BaseX 8.3 上执行相同的查询,我会惊讶地得到:<root myAtt="one"/><root myAtt="two"/>
。随之而来的是混乱。
显然,谓词内部路径表达式的前导 /
(根据 Kay 博士在 XSLT 2.0 和 XPath 2.0 第 4 版中的 "rooted path expression")在不同实现中的处理方式不同。
在这种情况下,/
应该是 select 包含上下文节点的树的文档节点。这就是撒克逊人所做的。
但在 BaseX 中,/
似乎 select 文档节点序列被谓词过滤。这将解释(如果我没弄错的话)谓词对所有文档的计算结果为 true,考虑到通用比较运算符 =
的特殊行为(总是在结果序列中至少有一项等于 'one').
那么,/
运算符在根路径表达式中的行为是否依赖于实现?
感谢关注。这是 bug in BaseX, which will be fixed in BaseX 8.4 (the fix is also available in the latest snapshot).
下面的查询是等价的,因为 当前上下文项 用作谓词中路径的输入,无论如何都将是当前根节点:
collection('myDocs')[root/@myAtt = 'one']