我使用xpath来提取属性的值,但是属性有一个命名空间,如何在没有命名空间的情况下获取xpath的值,或者更好的是,有没有办法用另一个命名空间替换命名空间?
xpath看起来像这样
string(//*:root/*:element/@attribute)
这会返回_01_1:SomeValue
我想要SomeValue
或ns: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
答案 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'],':')
这将在首次出现:
预先添加ns:
执行:
concat('ns:',substring-after(/root/element/@*[local-name()='attribute'],':'))