В вашем примере XML он не нужен (см. Ответ @ empo), но когда вы начинаете, самая важная вещь для изучения - это шаблон «преобразования личности». Он в основном копирует все ваши входные данные XML как есть и без изменений. Любые изменения, которые вам нужно внести, обычно могут быть сделаны путем переопределения преобразования идентификаторов другими шаблонами.
Вот пример таблицы стилей, которая дает вам вывод, который вы ищете:
<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>
ПРИМЕЧАНИЕ. «Идентификационное преобразование» не используется при обработке вашего входного XML, поскольку шаблон match="/ABC"
обрабатывает один элемент, который у вас есть. Однако, если вы добавите что-то в ваш XML-файл, он будет включен в вывод без изменений.
Например, это модифицированный ввод XML:
<ABC X="" Y="" Z="">
<FOO BAR=""/>
</ABC>
преобразован со следующей таблицей стилей (как и выше, только я добавил <xsl:apply-templates/>
в шаблон /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>
производит следующий вывод:
<CDE F="">
<ABC G="" X="" Y="" Z="">
<FOO BAR=""/>
</ABC>
</CDE>