xpath - 关于命名空间的不同行为 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 表达式吗?
这是一个错误,还是设计使然?
解决方案
不同的 XPath 引擎提供了不同的方式来绑定表达式中使用的名称空间前缀。我相信有些人会从源文档中获取名称空间绑定。因此,这不是不符合标准,而是标准将原始上下文的建立方式留给了特定的处理器。
潜在的问题是,您可能希望您的查询能够工作,而不管源文档中使用了哪些名称空间前缀。从源文档中提取名称空间绑定对于临时查询来说很方便,但这意味着对一个文档执行正确操作的查询会因另一个文档而失败。
推荐阅读
- java - 如何一次加载多个 Admob 广告并在队列中显示
- javascript - 查找元素内的所有@tagnames,然后在其上插入一个链接
- python - 在远程主机上运行脚本而不关心 ssh 会话
- python - 为什么在 Python 中添加分号会改变结果?
- python-3.x - 未来的龙卷风意外异常
超时后 - reactjs - 第一个带有 create-react-app 的应用,npm start 不工作
- modal-dialog - SharePoint 颜色选择器模式对话框不自动调整
- firebase - 当我通过 Firebase 云消息传递发送推送通知时,我的 React Native 应用程序关闭
- angular - 在 Angular 5 中等待多个 Observables
- twitter-bootstrap - How to change column width based on the number of columns present?