Xml 获取默认名称空间的XPath表达式

Xml 获取默认名称空间的XPath表达式,xml,xpath,namespaces,xml-namespaces,Xml,Xpath,Namespaces,Xml Namespaces,我正在寻找一个XPath表达式来获取节点的默认名称空间 我的XML文档可能如下所示 <aaa> <bbb xmlns="ns1" xmlns:ggg="ns2" attribute="value" attribute2="value2"> <ccc /> </bbb> <bbb xmlns="ns4" xmlns:ggg="ns5" attribute="value" attribute2="value

我正在寻找一个XPath表达式来获取节点的默认名称空间

我的XML文档可能如下所示

<aaa>
    <bbb xmlns="ns1" xmlns:ggg="ns2" attribute="value" attribute2="value2">
        <ccc />
    </bbb>
    <bbb xmlns="ns4" xmlns:ggg="ns5" attribute="value" attribute2="value2">
        <ddd />
    </bbb>
</aaa>
此表达式仅选择
属性
-和
属性2
-节点

/aaa/*[name()='bbb' and position()=1]/namespace::*
此表达式不选择任何内容

如果有人能给我一个提示,我将不胜感激。

这解释了xpath中的名称空间uri函数

看起来你想要这样的东西:

namespace-uri(/aaa/*[name()='bbb' and position()=1])
如果未指定名称空间,则结果将是一个空字符串

编辑:我重读了你的问题,不确定我的答案是否是你想要的。namespace uri函数用于查找节点的uri,如
。它将返回ns1的uri。我不确定是否有一种方法可以使用x-path来查看名称空间定义,而不是在实际使用它们的时候

你的表情

/aaa/*[name()='bbb' and position()=1]/namespace::*
正确,并返回三个命名空间节点。问题可能在于返回这些节点后处理这些节点的方式。这个表达式应该可以在XPath1.0和XPath2.0中使用,尽管我还没有使用JDK中内置的XPath引擎进行检查

(顺便提一下,由于您使用的是JDK 1.7,因此您使用的是XPath 1.0,这一概念完全不符合逻辑,因为Java用户可以使用几个XPath 2.0引擎)

要仅返回与默认命名空间对应的命名空间URI,请使用

/aaa/*[name()='bbb' and position()=1]/namespace::*[name()='']
namespace-uri(/aaa/*[name()='bbb' and position()=1])
或者实际上,由于此查询已经假定bbb元素位于默认名称空间中,因此使用

/aaa/*[name()='bbb' and position()=1]/namespace::*[name()='']
namespace-uri(/aaa/*[name()='bbb' and position()=1])

谢谢你的回答。我很高兴我没有犯错误。它实际上是内置的XPath引擎。现在我用的是萨克森图书馆,一切都很好。嗨,你们理解我的意思。这是一个很好的解决方案,尽管和我的查询一样,它在XPath引擎中构建时不起作用。对撒克逊图书馆的一个改变很有效。谢谢