Mini Shell
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:variable name="rootnode" select="name(child::node()[position()=1])"/>
<xsl:element name="{$rootnode}">
<xsl:if test="count(child::node()[position()=1]/attribute::*) > 0">
<xsl:copy-of select="child::node()[position()=1]/@*"/>
</xsl:if>
<xsl:apply-templates select="child::node()[position()=1]"/>
</xsl:element>
</xsl:template>
<xsl:template match="child::node()[position()=1]">
<xsl:choose>
<xsl:when test="count(ancestor-or-self::node()) > 2">
<xsl:for-each select="child::node()">
<xsl:sort select="name()" order="ascending"/>
<xsl:call-template name="child-label">
<xsl:with-param name="nodename" select="name()"/>
</xsl:call-template>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="child::node()">
<xsl:call-template name="child-label">
<xsl:with-param name="nodename" select="name()"/>
</xsl:call-template>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="child-label">
<xsl:param name="nodename"/>
<xsl:element name="{$nodename}">
<xsl:if test="count(attribute::*) > 0">
<xsl:copy-of select="@*"/>
</xsl:if>
<xsl:if test="count(child::node()) > 0">
<xsl:for-each select="child::node()">
<xsl:sort select="name()" order="ascending"/>
<xsl:call-template name="child-label">
<xsl:with-param name="nodename" select="name()"/>
</xsl:call-template>
</xsl:for-each>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="*"/>
</xsl:stylesheet>
Zerion Mini Shell 1.0