在所有元素上应用模板并返回它们,XSLT

时间:2013-02-11 08:41:12

标签: xml xslt xml-parsing xslt-2.0

如何使用XSLT转换XML文档,我读取输入,将转换(例如修剪前导和尾部空格)应用于文档中的所有元素,并返回XML文档及其完整结构? (另请参阅How can I trim space in XSLT without replacing repating whitespaces by single ones?了解修剪问题)

我开始使用以下代码复制所有元素:

<xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

工作正常。现在我想通过添加一些行来应用转换:

<xsl:template match="@* | node()">
    <xsl:copy>

      <xsl:apply-templates select="@* | node()">
        <xsl:call-template name="string-trim">
          <xsl:with-param name="string" select="@* | node()" />
        </xsl:call-template>
      </xsl:apply-templates>

    </xsl:copy>
</xsl:template>

但似乎不允许在“apply-templates”-Tag中添加“call-template”-Tag。

如何在将转换应用于每个元素的同时将完整结构从源文档复制到目标文档中?

1 个答案:

答案 0 :(得分:1)

您可以为text()@* ...

设置单独的模板
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="processing-instruction()|comment()|*">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:call-template name="string-trim">
            <xsl:with-param name="string" select="." />
        </xsl:call-template>                
    </xsl:template>

    <xsl:template match="@*">
        <xsl:attribute name="{name()}">
            <xsl:call-template name="string-trim">
                <xsl:with-param name="string" select="." />
            </xsl:call-template>        
        </xsl:attribute>
    </xsl:template>

    <xsl:template name="string-trim">
        <xsl:param name="string"/>
        ?????
    </xsl:template>

</xsl:stylesheet>

不要忘记用你的名字替换名为“string-trim”的模板。