首页 文章

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

提问于
浏览
1

我正在寻找一个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>

我想得到 ns1 . 我在Java 1.7中进行了编程(因此它是XPath 1.0),并使用http://chris.photobooks.com/xml/default.htm上的在线XPath可视化器进行了测试 .

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

此表达式仅选择 attribute - 和 attribute2 -nodes .

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

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

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

2 回答

  • 0

    你的表达

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

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

    (顺便提一下,因为你使用的是JDK 1.7,所以你使用的是XPath 1.0是一个完整的非sequitur,因为有几个XPath 2.0引擎可供Java用户使用) .

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

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

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

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

    page解释了xpath中的namespace-uri函数 .

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

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

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

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

相关问题