如何选择特定命名空间中的元素?

时间:2008-10-09 13:24:26

标签: xml xpath xml-namespaces xalan xmlspy

我无法选择属于特定命名空间的元素。我的xpath表达式在XMLSpy中工作,但在使用Xalan库时失败..

<item>
   <media:content attrb="xyz">
     <dcterms:valid>VALUE</dcterms:valid>
  </media:content>
</item>

我的表达是./item/media:content/dcterms:valid。我已经在我的XSLT中添加了两个命名空间定义。同样,这会在XMLSpy中选择正确的值,但在运行Xalan库时会失败。

有什么想法吗?

6 个答案:

答案 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>

即。

  • 的xmlns:DCTERMS = “HTTP://dcterms.example”
  • 的xmlns:媒体= “HTTP://media.example”

答案 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。