关于XSLT的初学者问题“apply-templates”

时间:2011-02-23 17:42:07

标签: xml xslt

对于这样一个非常简单的XML:

<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd>
        <title>Greatest Hits</title>
        <artist>Dolly Parton</artist>
        <country>USA</country>
        <company>RCA</company>
        <price>9.90</price>
        <year>1982</year>
    </cd>
</catalog>

和一个简单的xslt:

<xsl:template match="/">
 <xsl:apply-templates/>  
</xsl:template>

为什么会产生如下输出:

Empire Burlesque
Bob Dylan
USA
Columbia
10.90
1985

Hide your heart
Bonnie Tyler
UK
CBS Records
9.90
1988

Greatest Hits
Dolly Parton
USA
RCA
9.90
1982

所有XML标签都去了哪里?我应该围绕<xsl:apply-templates/> <xsl:copy>标签可以让它发挥作用吗?

1 个答案:

答案 0 :(得分:5)

这是因为内置模板,访问所有元素,打印文本和属性节点的值(只要模板适用于它们)。有关完整说明,请参阅我之前问题的答案:

XSLT 1.0 text nodes printing by default

您可以使用xsl:copy执行identity transform

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

将输出源文档的副本。