在XSLT中匹配没有名称空间的节点

时间:2012-10-29 10:27:20

标签: xslt xslt-2.0

给出以下XSLT:

<stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/XSL/Transform"
    xmlns:cm="http://api.example.com/schema">

    <template match="?">
        <element name="cm:Foo"><value-of select="?" /></element>
    </template>

</stylesheet>

这个XML:

<a>
  <b>cat</b>
</a>

如何匹配a节点并选择b节点的值?

请注意,它们没有任何命名空间,并且已经使用了样式表中的默认命名空间,因此只有match="a"select="b"不起作用(据我所见)。< / p>

3 个答案:

答案 0 :(得分:1)

一个XML文档的默认命名空间(您的XSLT样式表)不会以任何方式影响另一个 XML文档是否具有默认命名空间。

只需使用

<xsl:template match="a">
  <xsl:value-of select="b"/>
</xsl:template>

另外,请记住,XPath始终将未加前缀的名称视为属于&#34;没有名称空间&#34;。

答案 1 :(得分:1)

@pgfearo发布并删除了一个正确的答案。解决方案是在xpath-default-namespace=""上设置stylesheet。所以工作xslt将是:

<stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/XSL/Transform"
    xmlns:cm="http://api.example.com/schema"
    xpath-default-namespace="">

    <template match="a">
        <element name="cm:Foo"><value-of select="b" /></element>
    </template>

</stylesheet>

没有设置它不匹配的xpath-default-namespace,这是有道理的,因为没有带有XSL Transform命名空间的ab节点。

答案 2 :(得分:0)

<xsl:template match="a">
  <xsl:value-of select="b"/>
</xsl:template>

应该这样做,因为样式表代码中的默认命名空间对XSLT模式和XPath表达式无关紧要。因此,a始终表示没有名称空间中具有本地名称a的元素,除非您使用XSLT 2.0并设置xpath-default-namespace="...",请参阅http://www.w3.org/TR/xslt20/#unprefixed-qnames。您的xmlns="..."并不重要。