これはどうですか(コメントで要求されているように、両方向に変換するように変更されています):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Prevent Type attributes from being copied to the output-->
<xsl:template match="@Type" />
<!-- Convert <Section Type="Nnn" ... /> into <Nnn ... /> -->
<xsl:template match="Section">
<xsl:element name="{@Type}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<!-- Convert <Nnn .... /> into <Section Type="Nnn" ... /> -->
<xsl:template match="Sections//*[not(self::Section)]">
<Section Type="{name()}">
<xsl:apply-templates select="@* | node()" />
</Section>
</xsl:template>
</xsl:stylesheet>
最初の例で実行したときの出力:
<Sections>
<Type1 Text="blabla1">
<Type2 Text="blabla2" />
</Type1>
</Sections>
2 番目の例で実行したときの出力:
<Sections>
<Section Type="Type1" Text="blabla1">
<Section Type="Type2" Text="blabla2" />
</Section>
</Sections>