如何获取没有命名空间的属性值?

时间:2014-03-21 12:00:17

标签: xml xpath

我使用xpath来提取属性的值,但是属性有一个命名空间,如何在没有命名空间的情况下获取xpath的值,或者更好的是,有没有办法用另一个命名空间替换命名空间?

xpath看起来像这样

string(//*:root/*:element/@attribute)

这会返回_01_1:SomeValue我想要SomeValuens:SomeValue

不幸的是,我无法共享实际的XML,但下面是一个可用于参考的xml。

<root xmlns:_01_1="http://SOMEURL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<element xsi:attribute="_01_1:SomeValue">Element Value</element>
</root>

在这里,我希望只有SomeValue或者可以用_01_1代替ns并获取ns:SomeValue

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用local-name()

string(root/*:element/@*[local-name()='attribute']) 这将为您提供“SomeValue”而不是“_01_1:SomeValue”。

示例:

<root>
<hello xmlns:foo="http:asdf.com">
<something foo:yo="hi">
</something>
</hello>
</root>

string(root/hello/@*[local-name()='yo']) 

返回'hi'

如果你有类似的话:

<root>
    <hello xmlns:foo="http:asdf.com">
    <something foo:yo="01_1:hi">
    </something>
    </hello>
    </root>

想要01_1:删除,你可以将结果包装成如下所示:

translate(string(root/hello/@*[local-name()='yo']),"_01_1:","")

如果您希望使用此路线,则可以在不使用local-name()的情况下将上述内容应用于原始XPath。

对于问题中提供的XML:

translate(string(root/element/@*[local-name()='attribute']), "_01_1:","")

@*将返回节点的所有属性,因此在这种情况下,element的所有属性。 你可以像使用空格一样用translate()操作替换你想要的任何东西,它会将给定参数“_01_1:”映射到该值。因此,如果您希望得到“ns:SomeValue”的结果,请使用:

translate(string(root/element/@*[local-name()='attribute']), "_01_1:","ns:")

使用//代替root只是相对路径与绝对路径的示例。如果您不确定要查找数据的文档中的位置或目标节点的开始位置,可以使用//*标识符来检查更广泛的范围。例如//root =“从根元素开始并按照从顶部开始并遍历到底部的所有路径”,而root/element/etc只会说“仅检查直接跟随etc个节点来自root->element->etc的路径,相对于文档的文字 root

答案 1 :(得分:0)

仅举例SomeValue

substring-after(/root/element/@*[local-name()='attribute'],':')

这将在首次出现:

后返回Substring

预先添加ns:执行:

concat('ns:',substring-after(/root/element/@*[local-name()='attribute'],':'))