Alex Schneider: ebene Struktur in Baumstruktur

Beitrag lesen

Hallo,

ich weiß, ich habe schon so einen Artikel gesehen -ich finde ihn nur nicht.

Es handelt sich um diese Struktur:
<verzeichnis>
 <object level="1"/>
 <object level="2"/>
 <object level="3"/>
 <object level="1"/>
 <object level="2"/>
 <object level="2"/>
 <object level="1"/>
 <object level="2"/>
 <object level="3"/>
 <object level="2"/>
</verzeichnis>

Als Baum sollte das dann so Aussehen:

<verzeichnis>
 <object level="1">
   <object level="2">
      <object level="3"/>
        </objekt>
      </objekt>
 <object level="1">
   <object level="2"/>
   <object level="2"/>
      <objekt>
 <object level="1">
    <object level="2">
       <object level="3"/>
         </objekt>
    <object level="2"/>
       <object>
</verzeichnis>

Die Objekte haben selbstverständlich weitere Kindelemente und die Objekttiefe sollte nicht beschränkt sein.

Ich bin bis hierhin gelangt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <verzeichnis>
   <xsl:apply-templates select="verzeichnis/object[attribute::level=1]"/>
  </verzeichnis>
 </xsl:template>

<xsl:template match="verzeichnis/object">
 <object>
    <xsl:attribute name="level">
     <xsl:value-of select="./@level"/>
    </xsl:attribute>

<xsl:variable name="descendant">
     <xsl:value-of select="./@level + 1"/>
    </xsl:variable>

<xsl:if test="$descendant = following-sibling::object[1]/@level">
   <xsl:apply-templates select="following-sibling::object[attribute::level=$descendant]"/>
   <xsl:for-each select="following-sibling::object[attribute::level=$descendant]">
           <xsl:apply-templates select="following-sibling::object[attribute::level=$descendant]"/>
          </xsl:for-each>
      </xsl:if>
    </object>
 </xsl:template>
</xsl:stylesheet>

Gruß Alex