Majao: Index erstellen via XSL

Hallo Forum
als ich schon einmal die Frage nach der Erstellung einer Indexseite gestellt habe, gingen die Antworten in Richtung DITA, und da mir das bei meinem Anliegen langfristig nicht wirklich weiterhilft, möchte ich noch einmal auf das Thema zurückkommen.

Wie kann ich eine Indexseite erstellen, die automatisch Stichworte aus einem XML Dokument herausliest und alphabetisch auflistet. I

Beispiel XML Dokument:

<kapitel>
<absatz>
In diesem Absatz geht es um das Thema automatische Indexerstellung und dieses Stichwort soll auf einer eigenen Indexseite ausgegeben werden
<stichwort>Indexerstellung</stichwort>
</absatz>
<absatz>
Im zweiten Absatz geht es um die Verknüpfung der Indexseite mit den entsprechenden Textstellen. Aber alles nacheinander. Zuerst soll es mal nur um die Erstellung der Indexseite gehen
<stichwort>Verknüpfung</stichwort>
</absatz>
</kapitel>

Ziel ist also die Erstellung einer eigenen Indexseite

INDEXSEITE

  • Indexerstellung
  • Verknüpfung
    .....

Ausgehend von dieser Indexseite möchte ich später die verschiedenen Fundstellen zu einem Indexeintrag auf einer Ergebnisseite auflisten und von dieser Ergebnisseite dann die ursprünglichen TAbsätze aufrufen

Vielen Dank für jede Hilfe
M.

  1. Für den Fall, dass ich es richtig verstanden habe:
    <xsl:template match="/">
      <html>
        <head>
          <title>Indexseite</title>
        </head>
        <body>
        <!-- alle Stichworte durchlaufen -->
          <xsl:for-each select="kapitel/absatz/stichwort">
            <!-- alle Stichworte alphabetisch aufsteigend sortieren -->
            <xsl:sort select="." order=ascending" data-type="text" />
              <a href="Link zu Stichwort"><xsl:value-of select="." /></a>
          </xsl:for-each>
        </body>
      </html>
    </xsl:template>

    Anmerkung:
    Die Links speicherst du dann am besten für die einzelnen Absätze mit (z.B. als Attribut des Absatz-Tags)

    1. Vielen Dank, genau um diese Funktion geht es.
       Eine Indexseite enthält jedes Stichwort allerdings nur einmal. Wie erreiche ich es, dass ein Eintrag, der schon vorhanden ist, nicht ein zweites oder drittes Mal gelistet wird.

      Eine feste Verknüpfung von Indexeintrag und Absatz hilft aus demselben Grund nicht weiter (es sei denn, es gibt nur einen einzigen Absatz zu einem Stichwort). Vielmehr muss ein Indexeintrag zunächst alle vorhandenen Einträge aufrufen, dies sollte auf der erwähnten Ergebnisseite geschehen.

      Es sind meine ersten Schritte mit XML/XSL und vielleicht ein paar Schritte zuviel auf einmal ..  :-)

      Vielen Dank nochmal
      M.

      1. Habe die Lösung nun gefunden, zumindest was den Aufbau der Indexseite betrifft, und zwar über 'xsl:for-each-group':

        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
           <xsl:template match="/">
              <html>
                 <head>
                    <title />
                 </head>
                 <body>
                    <xsl:apply-templates select="kapitel" />
                 </body>
              </html>
           </xsl:template>
           <!-- diesmal in einem Pulldown-Menu, warum nicht -->
           <xsl:template match="kapitel">
              <p>
                 <xsl:for-each-group select="absatz" group-by="stichwort">
                    <xsl:sort select="current-grouping-key()" data-type="number" />
                       <xsl:value-of select="current-grouping-key()" />
                 </xsl:for-each-group>
              </p>
           </xsl:template>
        </xsl:stylesheet>

        Jetzt bleibt nur noch die Erstellung der Ergebnisseite bzw. die Generierung der geeigneten Verknüpfungen, wird schon alles noch werden (mühsam nährt sich der Anfänger .... )
        M.