用于获取默认命名空间的XPath表达式

时间:2013-12-09 19:43:13

标签: xml xpath namespaces xml-namespaces

我正在寻找一个XPath Expression来获取节点的默认命名空间。

我的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>

我想得到ns1。我已尝试使用以下表达式,但没有一个工作(我在Java 1.7中编程(因此它是XPath 1.0)并使用http://chris.photobooks.com/xml/default.htm上的在线XPath可视化工具进行测试。

/aaa/*[name()='bbb' and position()=1]/attribute::*

此表达式仅选择attribute - 和attribute2 - 节点。

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

此表达式不会选择任何内容。

如果有人暗示我,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

你的表达

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

是正确的并返回三个命名空间节点。问题可能在于返回它们后处理这些节点的方式。该表达式应该在XPath 1.0和XPath 2.0中都有效,尽管我没有使用内置于JDK的XPath引擎进行检查。

(顺便提一下,因为您使用的是JDK 1.7,因此您使用的是XPath 1.0,因为Java用户可以使用多个XPath 2.0引擎,因此使用XPath 1.0。)

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

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

或者实际上,由于此查询已假定bbb元素位于默认命名空间中,请使用

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

答案 1 :(得分:0)

这个page解释了xpath中的namespace-uri函数。

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

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

如果未指定命名空间,则会得到一个空字符串作为结果。

编辑:我重读了你的问题,我不确定我的答案是你在寻找什么。 namespace-uri函数用于查找<ns1:bbb>等节点的uri。它将返回ns1的uri。我不确定有没有办法使用x-path查看命名空间定义,而不是实际使用它们。