0

当我评估这个 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 表达式吗?

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

4

2 回答 2

3

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

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

于 2020-06-24T10:16:27.270 回答
1

在 XQuery 中,您可以声明要在查询中使用的任何名称空间:

declare namespace n0 = 'http://example.com';
declare namespace n1 = 'http://example.com';

//superhero[n0:name="Superman"]/n1:name

https://xqueryfiddle.liberty-development.net/bdxZ8S

请参阅https://www.w3.org/TR/xquery-31/#id-namespace-declaration上的规范

于 2020-06-24T11:37:34.633 回答