<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gl="http://www.iro.umontreal.ca/lapalme"
    version="2.0">
    
    <xsl:strip-space elements="*"/> 
    <xsl:output omit-xml-declaration="yes" method="text"/>
    
    <xsl:template match="/">
         <xsl:apply-templates>
            <xsl:with-param name="indent"  select="0"/>
        </xsl:apply-templates>
        <xsl:text>
</xsl:text>
    </xsl:template>
    
    <xsl:function name="gl:nl-and-indent">
        <xsl:param name="nb"/>
        <xsl:value-of select="concat('&#xA;',
            string-join(for $i in 1 to $nb return ' ',''))"/>
    </xsl:function>
    
    <xsl:template match="@*">
        <xsl:param name="indent"/>
        <xsl:if test="position()>1">
            <xsl:value-of select="gl:nl-and-indent($indent)"/>
        </xsl:if>        
        <xsl:text>@</xsl:text>
        <xsl:value-of select="local-name()"/>
        <xsl:text>[</xsl:text><xsl:value-of select="."/><xsl:text>]</xsl:text>
    </xsl:template>
    
    <xsl:template match="text()">
        <xsl:param name="indent"/>
        <xsl:if test="count(../@*)>0 or position()>1">
            <xsl:value-of select="gl:nl-and-indent($indent)"/>
        </xsl:if>        
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>
    
    <xsl:template match="*">
        <xsl:param name="indent"/>
        <xsl:if test="count(../@*)>0 or position()>1">
            <xsl:value-of select="gl:nl-and-indent($indent)"/>
        </xsl:if>        
        <xsl:value-of select="local-name()"/>
        <xsl:text>[</xsl:text>
        <xsl:apply-templates select="@*|*|text()">
             <xsl:with-param name="indent" 
                 select="$indent + string-length(local-name())+1"/>
        </xsl:apply-templates>
        <xsl:text>]</xsl:text>
     </xsl:template>
    
</xsl:stylesheet>