Hallo,
Sorry, ich habe wirklihc übersehen, dass du noch geantwortet hast!
Ich versteh' nicht ganz wie dies denn möglich sein soll. Ich durchlaufe alle Gruppen mit for-each und sortiere zuerst nach dem Attribut top. Damit habe ich gleich die erste Gruppe "ghi". So weit so gut. Nun weiß ich aber nicht, wie ich nun sortieren soll, um als nächstes die Gruppe "mno" auszuweisen. Der Hinweis dazu steht erst in der Gruppe "ghi".
OK, jetzt verstehe ich das Problem.
Hier eine Lösung mit lauten for-each. Sie würde für dein Beispiel funktionieren, aber auch nur genau dafür, d.h. nur für eine Hierarchie von "top --> untergruppe --> unter-unter-gruppe".
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="topG" match="Gruppe[@top]" use="."/>
<xsl:key name="secG" match="Gruppe" use="@name"/>
<xsl:template match="/data">
<xsl:for-each select="key('topG', Gruppe)">
<!--
hier was auch immer die ausgabe sein soll
<xsl:value-of select="@name"/>
-->
<xsl:for-each select="Element">
<!--
hier was auch immer die ausgabe sein soll
<xsl:value-of select="@name"/>
-->
</xsl:for-each>
<!-- hier das Ende der Gruppe!!! also z.B.: </div> setzen -->
<xsl:for-each select="key('secG', Element/@Gruppe)">
<xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number" />
<!--
hier was auch immer die ausgabe sein soll
<xsl:value-of select="@name"/>
-->
<xsl:for-each select="Element">
<!--
hier was auch immer die ausgabe sein soll
<xsl:value-of select="@name"/>
-->
</xsl:for-each>
<!-- hier das Ende der Gruppe!!! also z.B.: </div> setzen -->
<xsl:for-each select="key('secG', Element/@Gruppe)">
<xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number" />
<!--
hier was auch immer die ausgabe sein soll
<xsl:value-of select="@name"/>
-->
<xsl:for-each select="Element">
<!--
hier was auch immer die ausgabe sein soll
<xsl:value-of select="@name"/>
-->
</xsl:for-each>
<!-- hier das Ende der Gruppe!!! also z.B.: </div> setzen -->
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
Die ausgabe ist:
ghi
123
345
456
mno
234
456
678
abc
345
567
789
jkl
147
258
369
def
369
258
147
Hier eine andere Lösung, wo die Hierarchietiefe keine Rolle spielt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="topG" match="Gruppe[@top]" use="."/>
<xsl:key name="secG" match="Gruppe" use="@name"/>
<xsl:template match="/data">
...
<xsl:for-each select="key('topG', Gruppe)">
<xsl:value-of select="@name"/>
<xsl:apply-templates select="Element">
<xsl:sort select="@name" data-type="number"/>
</xsl:apply-templates>
<xsl:apply-templates select="key('secG', Element/@Gruppe)">
<xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number"/>
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="Gruppe">
<xsl:value-of select="@name"/>
<xsl:apply-templates select="Element">
<xsl:sort select="@name" data-type="number"/>
</xsl:apply-templates>
<xsl:apply-templates select="key('secG', Element/@Gruppe)">
<xsl:sort select="//Element[@Gruppe = current()/@name]/@name" data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Element">
<xsl:value-of select="@name"/>
</xsl:template>
...
Grüße
Thomas