这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="planet">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<planet>
<venus> sometext
<mass>123</mass>
</venus>
<mars>text about mars</mars>
</planet>
产生想要的正确结果:
<venus> sometext
<mass>123</mass>
</venus>
<mars>text about mars</mars>
第二种解决方案 - 更直接和更短:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy-of select="node()"/>
</xsl:template>
</xsl:stylesheet>
说明:
在这两种解决方案中,我们都避免复制元素树的根,并复制它的子树。
在第一个解决方案中,子树的复制是恒等规则的影响——如果将来我们改变计划并决定不简单地复制子树的节点,而是转换部分或全部节点,这给了我们更大的灵活性.
在第二个解决方案中,复制是通过一条 XSLT 指令完成的—— <xsl:copy-of>
。在这里,我们用灵活性换取速度和紧凑性。