XSLT - 将标记添加到text()节点

时间:2009-06-22 22:15:52

标签: xslt

我正在尝试实现一个文本过滤器,为每个文本节点添加一个父节点。

<xsl:template match="text()">
   <aNewTag><xsl:value-of select="."/></aNewTag>
</xsl:template>

这可以正常工作,直到我通过以下方式间接调用它:

<xsl:apply-templates/>

但如果我直接使用

调用模板
<xsl:apply-templates select="text()"/>

新标签消失。

任何人都可以解释我为什么吗?

干杯

3 个答案:

答案 0 :(得分:1)

我对自己的代码感到有点困惑。完整的示例如下所示:

<xsl:template match="/">
    <xsl:call-template name="a">
        <xsl:with-param name="b">
            <xsl:apply-templates select="text()"/>
        </xsl:with-param>
    </xsl:call-template>
</xsl:template>

<xsl:template name="a">
    <xsl:param name="b"/>
    <xsl:value-of select="$b"/> <!-- here is my error -->
</xsl:template>

<xsl:template match="text()">
    <aNewTag>
        <xsl:value-of select="."/>
    </aNewTag>
</xsl:template>

我的错误是,我没有在调用模板中看到value-of。如果我将value-of更改为apply-templates,一切正常。

感谢

答案 1 :(得分:0)

如果使用不带select属性的xal:apply-templates元素,则select的值隐式设置为node(),即所有子节点,因此text()模板匹配。

答案 2 :(得分:0)

我认为问题在于模板“a”中参数“b”是一个节点集。要访问它,您可能必须在XSL中使用“节点集”扩展功能。它不是标准XSLT的一部分,因此您需要指定扩展名。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="urn:schemas-microsoft-com:xslt">
    <xsl:template match="/">
        <xsl:call-template name="a">
            <xsl:with-param name="b">
                <xsl:apply-templates select="text()"/>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="a">
        <xsl:param name="b"/>
        <xsl:for-each select="ext:node-set($b)">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="text()">
        <aNewTag>
            <xsl:value-of select="."/>
        </aNewTag>
    </xsl:template>
</xsl:stylesheet>

这个仅适用于Microsoft的XML解析器(MSXML)。对于其他XML处理器,例如xsltproc,应使用名称空间“http://exslt.org/common”。

然后,这允许您访问构成“b”参数的节点或节点,尽管在上面的示例中我已经习惯了迭代它们。

这是一篇解释节点集

的文章

XML.Com Article