首页 > 解决方案 > 关于命名空间的不同行为 Xpath 和 XQuery

问题描述

当我评估这个 XPath 表达式时://superhero[n0:name="Superman"]/n1:name在这个 xml 上:

<n0:rootElement xmlns:n0='http://example.com' xmlns:n1='http://example.com'>
    <superheroes>
        <superhero>
            <n0:name>Superman</n0:name>
            <n1:name>Clark</n1:name>
        </superhero>
        <superhero>
            <n0:name>Spiderman</n0:name>
            <n1:name>Peter</n1:name>
        </superhero>
    </superheroes>
</n0:rootElement>

使用 XPath 评估器,我得到了预期的结果。

但是当我将它发送到 XQuery 处理器时,我收到一条错误消息,指出 Namespace prefix 'n0' has not been declared. 很奇怪吧?

引起投诉的总是括号中的前缀(它是否称为过滤器,也许?)。

我使用http://www.xpathtester.com来验证 XPath 和 XQuery 解释之间的区别。

它适用于仅限 XPath的https://codebeautify.org/Xpath-Tester 。

如果我用它替换n0:n1:替换*:它适用于 XQuery 处理器,但不适用于 XPath 测试人员。

这当然是我为澄清我的问题而写的一个玩具示例。在生产中,我称之为外部服务,我相信它是由 Saxon-HE 驱动的。我知道它接受 XQuery,所以我猜它是 XPath 表达式的“XQuery 模式”。

由于我是从另一个来源收到的,因此我对 xml 文件无能为力。我可以使用更好的 XQuery 表达式吗?

这是一个错误,还是设计使然?

标签: xpathxquerysaxon

解决方案


不同的 XPath 引擎提供了不同的方式来绑定表达式中使用的名称空间前缀。我相信有些人会从源文档中获取名称空间绑定。因此,这不是不符合标准,而是标准将原始上下文的建立方式留给了特定的处理器。

潜在的问题是,您可能希望您的查询能够工作,而不管源文档中使用了哪些名称空间前缀。从源文档中提取名称空间绑定对于临时查询来说很方便,但这意味着对一个文档执行正确操作的查询会因另一个文档而失败。


推荐阅读