XML元素有命名空间,我的XPATH不起作用

Voj*_*ech 14 xslt xpath xml-namespaces

我得到了以下XML:

<root>
  <items>
    <item>
      <title>Item</title>
      <details>
        <data xmlns="http://some_url">
          <length>10</length>
          <weight>1.2</weight>
        </data>
      </details>
    </item>
  </items>
</root>
Run Code Online (Sandbox Code Playgroud)

以下XPath不起作用意味着什么都不打印,因为"data"元素不存在:

/root/items/item/details/data
Run Code Online (Sandbox Code Playgroud)

但是当我删除"data"元素的"xmlns"命名空间属性时,它的内容被打印出来.如果不删除"data"元素的"xmlns"命名空间属性,xpath表达式应该如何工作?

我正在使用SAXON和XSL 1.0.

Dim*_*hev 15

这是XPath/XSLT中最常见的FAQ之一:

XPath将未加前缀的元素名称解释为属于"无命名空间",这就是在XPath表达式中仅指定其未加前缀的名称作为节点测试时,未选择属于默认(非空)命名空间的带有未加前缀名称的元素的原因.

解决方案是:

  1. 创建一个名称空间绑定,其中前缀(说"x")与默认名称空间相关联,然后指定x:elementName而不是elementName.

  2. 使用长,丑,不可靠的表达式,如: *[name() = 'elementName']

这是使用上述方法1的XSLT转换.:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:a="http://some_url">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:value-of select=
  "/root/items/item/details/a:data/a:weight"/>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

在提供的XML文档上应用此转换(使用Saxon 6.5.4或任何其他兼容的XSLT 1.0处理器)时:

<root>
    <items>
        <item>
            <title>Item</title>
            <details>
                <data xmlns="http://some_url">
                    <length>10</length>
                    <weight>1.2</weight>
                </data>
            </details>
        </item>
    </items>
</root>
Run Code Online (Sandbox Code Playgroud)

选择了正确/想要的节点,并将其字符串值复制到输出:

1.2
Run Code Online (Sandbox Code Playgroud)