Hi there,
I am trying to create an index of keywords of my online-book.
My source XML-file contains a lot of keywords which are more specified with
Elements (Level1 or even Level2):
<Stichwortliste>
<Stichwortdetails>
<Stichwort>
<Level1>ius civile</Level1>
<Titel titel_id="CBAHDGEI">Bürgerliches Recht, Zivilrecht,
ius civile</Titel>
<Kapitel>kap1_1.xml</Kapitel>
</Stichwort>
<Stichwort>
<Level1>Privatrecht</Level1>
<Titel titel_id="CBAHDGEI">Bürgerliches Recht, Zivilrecht,
ius civile</Titel>
<Kapitel>kap1_1.xml</Kapitel>
</Stichwort>
<Stichwort>
<Level1>Privatrecht</Level1>
<Level2>allgemeines</Level2>
<Titel titel_id="CBAHDGEI"> Recht im objektiven und
subjektiven Sinn</Titel>
<Kapitel>kap2_4.xml</Kapitel>
</Stichwort>
<Stichwort>
<Level1>Privatrecht</Level1>
<Titel titel_id="CBAHDGEI"> Das Gesamtrechtssystem </Titel>
<Kapitel>kap5_3.xml</Kapitel>
</Stichwort>
</Stichwortdetails>
<Stichwortliste>
I would like to have the following output:
The keywords are sorted alphabetically and if there are more keywords that
are equal the name of the keyword should be printed once and the
chapter-specifications should follow. And if there are keywords that own the
more specified Level2 then these keywords (+chapter-specifications) should
not be given out until all the keywords (only with Level1-elements of the
same name) have been printed out.
Here is what I have:
I
ius civile [kap1_1]
P
Privatrecht [kap1_1],
allgemeines [kap2_4], [kap5_3]
Here is what I would like to have:
I
Ius civile [kap1_1]
P
Privatrecht [kap1_1], [kap5_3]
allgemeines [kap2_4]
Here is my XSL:
<xsl:key name="keyword-initial" match="Stichwort"
use="translate(substring(Level1,1,1),'abcdefghijklmnopqrstuvwxyzäöü123456789
0@','ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ###########')"/>
<xsl:key name="contacts-by-surname" match="Stichwort" use="Level1"/>
<xsl:template match="Stichwortdetails">
<xsl:for-each select="Stichwort[count(. | key('keyword-initial',
translate(substring(Level1,1,1), 'abcdefghijklmnopqrstuvwxyzäöü1234567890@',
'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ###########'))[1]) = 1]">
<xsl:sort select="Level1"/>
<xsl:variable name="initial"
select="translate(substring(Level1,1,1),
'abcdefghijklmnopqrstuvwxyzäöü1234567890@',
'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ###########')"/>
<a name="{$initial}"/>
<div><xsl:value-of select="$initial"/></div>
<ul>
<xsl:for-each select="key('keyword-initial',
$initial)">
<xsl:sort select="Level1"/>
<xsl:if test="count(. |
key('contacts-by-surname', Level1)[1]) = 1">
<br/>
<span><xsl:value-of
select="Level1"/></span>
</xsl:if>
<xsl:if
test="not(name(Level1/following-sibling::*) = 'Level2')">
<span
style="color:green;"><xsl:apply-templates select="Level1"
mode="index.link"/></span>
</xsl:if>
<xsl:for-each select="Level2">
<xsl:sort select="Level2"/>
<br/>
<span style="color:red;
margin-left:20px;"><xsl:apply-templates select="."
mode="index.link"/></span>
</xsl:for-each>
</xsl:for-each>
</ul>
<br/>
</xsl:for-each>
</xsl:template>
It seems that the second for-each-loop <xsl:for-each select="Level2"> isn’t
correct, but I don’t know how to do it right.
It must be something like a grouping within a grouping?!?
Can you give me any advice?
Thanks
Martina