Hallo,
Eigentlich kannst du auf den named-Template verzichten und gleich so machen:
<xsl:template match="elem" mode="byname">
<xsl:variable name="gruppe" select="key('firstletter', translate(substring(@name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))" />
<xsl:if test="generate-id(.) = generate-id(key('firstletter', translate(substring(@name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])">
<h1><a id="label{substring($gruppe[1], 1, 1)}">label <xsl:value-of select="substring($gruppe[1], 1, 1)" /></a></h1>
<xsl:for-each select="$gruppe">
<xsl:sort select="@name" />
<p>
<xsl:value-of select="." />
</p>
</xsl:for-each>
</xsl:if>
</xsl:template>
Allerdings auf die 2-fache xsl:sort kannst du nicht verzeichten, dass muss also bleiben.
Mit dem generate-id-Zeug wird sichergestellt, daß pro Anfangszeichen im Name-Attribut genau ein Aufruf von groupelembyname geschieht.
<xsl:if test="generate-id(.) ....
Überprüft die Übereinstimmung des aktuellen Elements mit dem ersten Knoten aus xsl:key, wo d. anf.Buchstabe aus @name überinstimmt. Testet also das aktuelle element auf seine Gruppenzugehörigkeit.
<h1><a id="label{substring($gruppe[1], 1, 1)}">label <xsl:value-of select="substring($gruppe[1], 1, 1)" /></a></h1>
Das ist quasi das gemogelte: anstatt hier tatsächlich das erste element nach der Sortierreihenfolge (wäre name="aaa" aus dem XML) zu verlinken, wird einfach die anf.Buchstabe der Gruppe ausgegeben.
» »» <xsl:for-each select="$gruppe">
$gruppe ist hier zugegebener Maßen leicht irreführend, die Variable selektiert die Elemente die mit dem key() übereinstimmen. Was zwar eine Gruppe ergibt, jedoch enthält die Variable nur einzelne Elementen. Darum for-each.
<xsl:sort select="@name" />
Diese sortiert die Elementen innerhalb der Gruppe.
Das andere xsl:sort im apply-template sortiert (quasi) die Gruppen.
Klingt eigentlich einfach - aber da wär ich nie drauf gekommen.
Ja, ich wollte es auch erst anders machen (erstes Element in der sortierten Gruppe verlinken.) Dann bin ich daraufgekommen, dass das an sich nicht nötig ist.
Nochmals herzlichen Dank - wenn Du mal hier vorbeikommst, geb ich Dir nen Green Spot aus - jetzt trink ich erst mal einen auf Dein Wohl!
Danke, ich nehme dich bei Gelegenheit beim Wort ;-)
Grüße
Thomas