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