【问题标题】:how to select an element within a specific namespace?如何选择特定命名空间中的元素?
【发布时间】:2008-10-09 13:24:26
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: xml xpath xml-namespaces xalan xmlspy


    【解决方案1】:

    您需要实现 org.apache.xml.utils.PrefixResolver 以将前缀映射到命名空间 URI,然后将实例传递给您使用的 XPath 实例。这将允许您在 XPath 表达式中使用与文档中不同的前缀(您可能无法控制)。

    例如,您可以创建一个使用一对映射的实现(一个映射从前缀 -> 命名空间 URI,一个从 URI 映射到前缀)。

    在 JAXP 中,实现的等效接口是javax.xml.namespace.NamespaceContext

    【讨论】:

      【解决方案2】:

      您是否尝试过定义 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:media="http://media.example"

      【讨论】:

        【解决方案3】:

        您要在什么情况下评估您的 XPath? (例如,一个 XSLT?)如果是根元素,您可以尝试删除前导的“.”:“/item/media:content/dcterms:valid。”如果有一系列项目,您可以尝试在开头添加另一个斜杠:“//item/media:content/dcterms:valid”。这将选择文档中符合该条件的所有项目,无论它们位于文档结构中的哪个位置。

        【讨论】:

          【解决方案4】:

          XML 中的前缀在绑定到某个命名空间之前是没有意义的,对于 XPath 表达式也是如此——它不会仅仅因为您使用了相同的前缀而匹配。

          您必须创建自己的 PrefixResolver 类,该类将为您在 XPath 表达式中拥有的前缀提供完整的命名空间 URI。

          【讨论】:

            【解决方案5】:

            您可以尝试对本地名称进行 XPath 选择并(可选)提供命名空间 URI。以及示例:

            /*[local-name()='NewHireList' and namespace-uri()='http://BRE.NewHireList']/*[local-name()='Record' and namespace-uri()='']
            

            请参阅this page 了解更多信息,或在本地名称和 XPath 上搜索 Google。

            【讨论】:

              【解决方案6】:

              也许 XMLSpy 已经实现了 2.x XSLT 规范,我相信 XPath 是其中的一部分。 另一方面,Xalan 仍然是 1.x。

              【讨论】:

              • 有一个 XPath 1.0 和一个 XPath 2.0 规范,它们(基本上)对应于 XSLT 1.0 和 XSLT 2.0 的版本。他尝试的 XPath 是有效的 XPath 1.0。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-01-04
              • 2010-09-11
              • 1970-01-01
              • 2010-10-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多