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

时间:2012-06-11 13:43:15

标签: 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>

以下XPath不起作用意味着没有打印任何内容,因为“data”元素不存在:

/root/items/item/details/data

但是当我删除“data”元素的“xmlns”命名空间属性时,它的内容被打印出来。 如何在不删除“data”元素的“xmlns”命名空间属性的情况下,xpath表达式应该如何工作?

我正在使用SAXON和XSL 1.0。

2 个答案:

答案 0 :(得分:15)

这是XPath / XSLT中最常见的一个

XPath将未加前缀的元素名称解释为属于“无命名空间”,这就是当只有未加前缀的名称被指定为节点测试时,未选择属于默认(非空)命名空间的带有无前缀名称的元素的原因。一个XPath表达式。

解决方案是

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

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

  3. 以下是使用上述方法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>
    

    在提供的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>
    

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

    1.2
    

答案 1 :(得分:0)

在XPath中,您必须为命名空间分配前缀。如何执行此操作取决于您使用的XPath软件/库,但假设您将名称空间URI http://some_url与名称空间前缀someUrl相关联,则可以按如下方式更改XPath表达式:

/root/items/item/details/someUrl:data