1

给定以下 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"不起作用(据我所知)。

4

3 回答 3

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它不匹配,这是有道理的,因为没有ab节点与 XSL 转换命名空间。

于 2012-10-29T14:47:14.193 回答
1

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

只需使用

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

另外,请记住,XPath 总是将无前缀的名称视为属于“无命名空间”。

于 2012-10-29T12:02:24.717 回答
0
<xsl:template match="a">
  <xsl:value-of select="b"/>
</xsl:template>

应该作为样式表代码中的默认命名空间对 XSLT 模式和 XPath 表达式无关紧要。所以a总是意味着在没有命名空间中具有本地名称的元素a,除非您使用 XSLT 2.0 和 set xpath-default-namespace="...",请参阅http://www.w3.org/TR/xslt20/#unprefixed-qnames。你的xmlns="..."没关系。

于 2012-10-29T11:24:40.290 回答