我无法选择属于特定命名空间的元素。我的xpath表达式在XMLSpy中工作,但在使用Xalan库时失败..
<item>
<media:content attrb="xyz">
<dcterms:valid>VALUE</dcterms:valid>
</media:content>
</item>
我的表达是./item/media:content/dcterms:valid
。我已经在我的XSLT中添加了两个命名空间定义。同样,这会在XMLSpy中选择正确的值,但在运行Xalan库时会失败。
有什么想法吗?
答案 0 :(得分:1)
您需要实现org.apache.xml.utils.PrefixResolver
以将前缀映射到名称空间URI,然后将实例传递给您使用的XPath
实例。这将允许您在XPath表达式中使用与文档中不同的前缀(您可能无法控制)。
例如,您可以创建一个使用一对映射的实现(一个映射来自前缀 - &gt;名称空间URI,一个映射来自URI到前缀)。
在JAXP中,要实现的等效接口是javax.xml.namespace.NamespaceContext
。
答案 1 :(得分:0)
您是否尝试过定义XML blob的命名空间?
<item xmlns:dcterms="http://dcterms.example" xmlns:media="http://media.example">
<media:content attrb="xyz">
<dcterms:valid>VALUE</dcterms:valid>
</media:content>
</item>
即。
答案 2 :(得分:0)
您在什么情况下尝试评估XPath? (例如,XSLT?)如果是根元素,您可以尝试删除前导“。”:“/ item / media:content / dcterms:valid”。如果有一系列项目,您可以尝试在开头添加另一个斜杠:“// item / media:content / dcterms:valid。”这将选择文档中与该条件匹配的所有项目,无论它们位于文档结构中的哪个位置。
答案 3 :(得分:0)
XML中的前缀在绑定到某个命名空间之前是没有意义的,对于XPath表达式也是如此 - 它只是因为你使用了相同的前缀而不匹配。
您必须创建自己的PrefixResolver类,它将为您的XPath表达式中的前缀提供完整的名称空间URI。
答案 4 :(得分:0)
您可以尝试在本地名称上选择XPath,并(可选)提供名称空间URI。例如:
/*[local-name()='NewHireList' and namespace-uri()='http://BRE.NewHireList']/*[local-name()='Record' and namespace-uri()='']
有关详情,请参阅this page,或使用google on local-name和XPath。
答案 5 :(得分:-1)
也许XMLSpy已经实现了2.x XSLT规范,我相信XPath是其中的一部分。 另一方面,Xalan仍然是1.x。