implemented as EXSLT function that is later used in XSLT key for grouping purposes
<func:function name="i:group-index">
<xsl:param name="term"/>
... uninteresting code that will feed $letters by elements
from localization file based on selected language ...
<xsl:variable name="long-letter-index"
select="$letters/l:l[. = substring($term,1,2)]/@i"/>
<xsl:variable name="short-letter-index"
select="$letters/l:l[. = substring($term,1,1)]/@i"/>
<xsl:variable name="letter-index">
<xsl:choose>
<xsl:when test="$long-letter-index">
<xsl:value-of select="$long-letter-index"/>
</xsl:when>
<xsl:when test="$short-letter-index">
<xsl:value-of select="$short-letter-index"/>
</xsl:when>
<!-- group number zero is reserved for symbols -->
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<func:result select="number($letter-index)"/>
</func:function>key definition
<xsl:key name="group-code"
match="indexterm"
use="i:group-index(primary)"/>