繁体   English   中英

为什么命名空间限定节点没有 XPath 语法?

[英]Why is there no XPath syntax for namespace-qualified nodes?

XML 文档中的某些节点具有命名空间,使用定义的前缀指定。

可以在 XPath 1.0 中指定local-name() ,因此忽略命名空间。

但是,我想让 XPath 的编写者能够使用其完整的命名空间限定名称作为标识符来查找节点。

推荐的方法是在调用代码(在我的例子中是 Java)中添加命名空间声明。 但这意味着编写 Xpath 的人没有使用命名空间的能力!

我们如何使用纯 XPath 通过完全限定名称查找节点?

不确定您所说的“作为标识符”是什么意思。

我们如何使用纯 XPath 通过完全限定名称查找节点?

在 XPath 1.0 中,通过使用 local-name() 和namespace-uri() ,例如

"*[local-name() = 'foo' and namespace-uri() = 'http://my.org/ns/2.0']"

在 XPath 2.0 中,有一组更丰富的与命名空间相关的函数,例如namespace-uri-from-QName() 但我不确定他们是否会根据您的需要改进上述内容。

目前处于工作草案状态的 XPath 3.0 将包括一个用于URI 限定 QName的文字表达式,允许直接指定命名空间 uri。

以下是 EQName 的一些示例:

  • pi 是没有命名空间前缀的词法 QName。
  • math:pi 是一个带有命名空间前缀的词法 QName。
  • "http://www.w3.org/2005/xpath-functions/math":pi 使用 URILiteral 指定命名空间 URI; 它不是一个词法 QName。

我认为Saxon 9.3包括 xpath 3.0 的预览实现,它应该可以通过 java api 使用。

可以在 XPath 查询期间使用命名空间。 在 Java 中,如果您还想在这些查询中始终使用前缀而不是完全限定的命名空间,则需要提供NamespaceContext的实现。 只需将NamespaceContext的实例添加到您的XPath - 我假设您使用标准的 JDK 实现 - 但这个概念也适用于 Jaxen 或其他人。

然后您可以执行查询,例如//customns:Element

如果您不使用或不能使用NamespaceContext (无论出于何种原因),那么唯一的解决方案似乎是使用local-namenamespace-uri函数:

Document doc = ...;
XPath xp = XPathFactory.newInstance().newXPath();
String name = "Element";
String ns = "http://www.custom.org/#";
String expr = "//*[local-name() = '"+name+" and namespace-uri() = '"+ns+"']";
Node node = ((NodeList)xp.evaluate(expr, doc, XPathConstants.NODESET)).item(0);

XPath 3.0 的规范说:

Q{http://www.w3.org/2005/xpath-functions/math}pi

这适用于此刻(2015 年 10 月),例如在 eXist-db 中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM