<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<xsl:call-template name="CHILDREN"/>
</xsl:template>
<xsl:template name="ELEMENT">
<xsl:variable name="ChildCount" select="count(child::node())" />
<xsl:choose>
<xsl:when test="self::text()">
<xsl:value-of select="self::node()" />
</xsl:when>
<xsl:when test="$ChildCount = 0">
<xsl:element name="{name(self::node())}">
<xsl:call-template name="ATTRIBUTE">
<xsl:with-param name="Count" select="count(attribute::node())"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:when test="$ChildCount > 0">
<xsl:element name="{name(self::node())}">
<xsl:call-template name="ATTRIBUTE">
<xsl:with-param name="Count" select="count(attribute::node())"/>
</xsl:call-template>
<xsl:call-template name="CHILDREN" />
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="CHILDREN">
<xsl:for-each select="child::node()">
<xsl:call-template name="ELEMENT" />
</xsl:for-each>
</xsl:template>
<xsl:template name="ATTRIBUTE">
<xsl:param name="Count" />
<xsl:if test="number($Count) >= 1">
<xsl:attribute name="{name(attribute::node()[$Count])}">
<xsl:value-of select="attribute::node()[$Count]"/>
</xsl:attribute>
<xsl:call-template name="ATTRIBUTE">
<xsl:with-param name="Count" select="$Count - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>