我有一些使用许多不同前缀的XML文件。大多数名称空间在本地声明,但不在根元素中声明。我需要一个XPath表达式来获取具有特定前缀terms
的所有元素。
<root>
<wrapper xmlns:terms="http://terms.example.com">
<terms:trid>somevalue</terms:trid>
<terms:identifier>someID-</terms:identifier>
<foo:bar>somevalue</foo:bar>
</wrapper>
</root>
我尝试//terms:*
并收到以下错误:
XPath失败的原因是:未声明前缀术语
有没有办法在没有在原始文件的根元素中声明命名空间的情况下获取这些元素?
答案 0 :(得分:2)
命名空间前缀本身在XML中没有意义。它们总是与名称空间URI结合使用 - 在名称空间声明中。即使有办法访问前缀:
substring-before(name(/root/wrapper/*[1]),":")
会返回
terms
在编写XPath表达式时,不应该依赖前缀。它们会非常脆弱,因为前缀被认为不具有任何意义,因此可以在不改变文档语义的情况下进行更改。
可能您正在尝试访问与特定名称空间URI关联的元素,而不管(任意)前缀。这是以下几种方法之一:
//*[namespace-uri() = "terms.example.com"]
,结果将是(个别结果由-------
分隔):
<terms:trid>somevalue</terms:trid>
-----------------------
<terms:identifier>someID-</terms:identifier>
但是,处理命名空间的最合适方法是使此命名空间URI可用于XPath引擎,并在路径表达式中为其指定前缀和前缀元素名称。