Hallo Julia,
habe einige Zeit gewartet, ob noch mehr Input zum Thema kommt. Wollte es aber nicht unversucht lassen. Das wäre wohl auch der algorithmische Ansatz.
Du sagst, dass $suchwoerter bereits vorab ermittelt wurde. Ich habe diese Sequenz zum Testen mit den Substantiven aus den Titeln befüllt.
Ich hoffe, etwa das ist gesucht:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="suchwoerter"
select="('Harry', 'Potter', 'Stein', 'Weisen', 'Kammer', 'Schreckens')"/>
<xsl:variable name="titel" select="//title"/>
<h1>Glossar</h1>
<xsl:for-each-group select="$suchwoerter" group-by="substring(., 1, 1)">
<xsl:sort select="current-grouping-key()" data-type="text" order="ascending"/>
<h2>
<xsl:value-of select="current-grouping-key()"/>
</h2>
<xsl:for-each select="$suchwoerter[starts-with(., current-grouping-key())]">
<xsl:sort select="." data-type="text" order="ascending"/>
<xsl:variable name="suchwort" select="."/>
<h3>
<xsl:value-of select="$suchwort"/>
</h3>
<ul>
<xsl:for-each select="$titel">
<xsl:sort select="." data-type="text" order="ascending"/>
<xsl:if test="contains(., $suchwort)">
<li>
<xsl:value-of select="."/>
</li>
</xsl:if>
</xsl:for-each>
</ul>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Ergebnis:
<h1>Glossar</h1>
<h2>H</h2>
<h3>Harry</h3>
<ul>
<li>Harry Potter und der Stein der Weisen</li>
<li>Harry Potter und die Kammer des Schreckens</li>
</ul>
<h2>K</h2>
<h3>Kammer</h3>
<ul>
<li>Harry Potter und die Kammer des Schreckens</li>
</ul>
<h2>P</h2>
<h3>Potter</h3>
<ul>
<li>Harry Potter und der Stein der Weisen</li>
<li>Harry Potter und die Kammer des Schreckens</li>
</ul>
<h2>S</h2>
<h3>Schreckens</h3>
<ul>
<li>Harry Potter und die Kammer des Schreckens</li>
</ul>
<h3>Stein</h3>
<ul>
<li>Harry Potter und der Stein der Weisen</li>
</ul>
<h2>W</h2>
<h3>Weisen</h3>
<ul>
<li>Harry Potter und der Stein der Weisen</li>
</ul>
Grüße,
Thomas