Hallo Andreas,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="firstletter" match="elem" use="translate(substring(@name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
...
<xsl:template match="allelems">
<!-- diverser anderer Kram, der mit dem Problem nichts zu tun hat... -->
<xsl:call-template name="abclist" />
<!-- diverser anderer Kram, der mit dem Problem nichts zu tun hat... -->
<xsl:apply-templates select="elem">
<xsl:sort select="@name" />
</xsl:apply-templates>
</xsl:template>
<xsl:template name="abclist">
<xsl:for-each select="elem[generate-id() = generate-id(key('firstletter', translate(substring(@name, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])]">
<xsl:sort select="@name"/>
<a href="#label{@name}"><xsl:value-of select="substring(@name, 1, 1)"/></a> 
</xsl:for-each>
</xsl:template>
<xsl:template match="elem">
<p><a name="label{@name}"></a><xsl:value-of select="." /></p>
</xsl:template>
</xsl:stylesheet>
----------
Grüße
Thomas