Hallo,
<xsl:key name="firstletter" match="elem" use="translate(substring(@name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
[...]Mal gucken - das muß ich mir erst in Ruhe reinziehen, was das tut.
Mit key hab ich noch nicht gearbeitet.
Der key erstellt quasi ein Array in dem alle <elem>-elemente drinn sind, der WErt des Schlüssels ist der erste Buchstabe (großgeschrieben) den @name-Attributes
------
<xsl:for-each select="elem[generate-id() = generate-id(key('firstletter', translate(substring(@name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])]">
"elem[generate-id()"
Generiert eine ID für das <elem>-Element
"generate-id(key('firstletter', translate(substring(@name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])]"
Generiert eine ID für das erste <elem>-Element aus der (mit xsl:key) erstellten Grupppe, wo der Schlüssel für das Aktuelle Element passt.
(also z.B. für das erste vorkommende <elem> dessen @name mit einem "A" beginnt.)
Wenn die zwei ID identisch sind, wird ein Link erstellt, mit dem Anfangsbuchstaben von @name des gegenwärtigen Elements.
-----------
Das Problem dabei ist der Zugriff auf das in der Sortierreihenfolge vorherige Element.
Wenn ich die Position des aktuellen Elements um 1 verringert für den Zugriff benutze, bekomme ich das entsprechende Element aus der XML-Dokumentreihenfolge, nicht aus der Sortierreihenfolge.
-----------
Sort gilt immer nur für die Sortierung in der Ausgabe, nie aber für die Sortierung im Transformationsprozess selbst.
Grüße
Thomas