Su ejemplo XML no lo necesitan (ver @ respuesta de empo), pero al comenzar, lo más importante para aprender es la plantilla de "transformación de identidad". Básicamente, copia toda su entrada XML tal cual y sin modificaciones. Cualquier cambio que necesite realizar generalmente se puede hacer anulando la transformación de identidad con otras plantillas.
He aquí un ejemplo de estilo que proporciona la salida que está buscando:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<!--IDENTITY TRANSFORM-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ABC">
<CDE F="">
<ABC G="">
<xsl:copy-of select="@*"/>
</ABC>
</CDE>
</xsl:template>
</xsl:stylesheet>
NOTA: "transformar la identidad" El no acostumbrarse al procesar su entrada XML porque la plantilla se encarga de la match="/ABC"
uno elemento que tienes. Sin embargo, si añadiera algo a su XML, se incluiría sin cambios en la salida.
Por ejemplo, esta entrada XML modificado:
<ABC X="" Y="" Z="">
<FOO BAR=""/>
</ABC>
transfomed con la siguiente hoja de estilo (igual al anterior, sólo añade el <xsl:apply-templates/>
a la plantilla /ABC
):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<!--IDENTITY TRANSFORM-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ABC">
<CDE F="">
<ABC G="">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</ABC>
</CDE>
</xsl:template>
</xsl:stylesheet>
produce el siguiente salida:
<CDE F="">
<ABC G="" X="" Y="" Z="">
<FOO BAR=""/>
</ABC>
</CDE>
+1 por pregunta limpia. –
+1 por lo que dijo el poder –