Thomas J.S.: Gliederung erstellen

Beitrag lesen

Hallo,

ich habe das erst mal mit einer XML-Datei probiert, die so aussieht:

<data>
<autoren>
<autor>Helfa</autor>
<autor>Berta</autor>
<autor>Zappa</autor>
<autor>PinkFloyd</autor>
<autor>Affengeil</autor>
<autor>Police</autor>
<autor>Polizei</autor>
<autor>Hügel</autor>
<autor>Pizza</autor>
<autor>Bieber</autor>
<autor>Aberhallo</autor>
</autoren>
</data>

Dazu gefunden habe ich eine XSL, die aber fehlerhaft ist:

Hmm... sorry, aber so richtig verstehe ich dich nicht. Ich habe dir die Lösung schon gegeben, wenn du dabei was nicht verstehst hättest du du ruhig rückfragen können.

Ich habe jetzt das Stylesheet was im verlinkten Archivthread vorhanden war hergenommen und in etwas 3 Minuten angepasst. Und auchwenn du sagt, "ja für dich ist das vielleicht leicht", hättest du auch kaum her als 10 Minuten dazu benötigt.

Ich habe die translate() Funktion belassen, falls einmal ein Name doch kleingeschrieben wird. Wenn du das nicht brauchst, kannst du die funktion entfernen. Dann machst du überall aus dem
translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
ein: substring(., 1, 1)
Auf die Klammerung achten!

Grüße
Thomas

-----------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="firstletter" match="autor" use="translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />

<xsl:template match="/data">
<html>
<head>
<title>ABC-Liste</title>
</head>

<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<xsl:template match="autoren">
<xsl:call-template name="abclist" />
<xsl:apply-templates select="autor" mode="byname">
  <xsl:sort select="."/>
</xsl:apply-templates>
</xsl:template>

<xsl:template name="abclist">
<xsl:for-each select="autor[generate-id() = generate-id(key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])]">
  <xsl:sort select="."/>
  <a href="#label{substring(., 1, 1)}"><xsl:value-of select="substring(.,1,1)"/></a>&#160;
  </xsl:for-each>
</xsl:template>

<xsl:template match="autor" mode="byname">
<xsl:variable name="gruppe" select="key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))" />
<xsl:if test="generate-id(.) = generate-id(key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])">
  <h1><a id="label{substring($gruppe[1], 1, 1)}"><xsl:value-of select="substring($gruppe[1], 1, 1)" /></a></h1>
         <xsl:for-each select="$gruppe">
          <xsl:sort select="." />
   <p>
    <xsl:value-of select="." />
   </p>
  </xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

------------------------------------------------------------------------

Die Ausgabe ist:

A  B  H  P  Z

A
Aberhallo
Affengeil

B
Berta
Bieber

H
Helfa
Hügel

P
PinkFloyd
Pizza
Police
Polizei

Z
Zappa