Zyrano: Inhaltsverzeichnis mit xsl

Hi, ich möchte zu folgender xml ein Inhaltsverzeichnis erstellen:

<?xml version="1.0" encoding="iso-8859-1"?>  
<?xml-stylesheet type="text/xsl" href="style.xsl"?>  
<Buch>  
  <topic>Überschrift(1)</topic>  
  <Text1>  
    <topic>Überschrift(1.1)</topic>  
    <Text2>  
      <topic>Überschrift(1.1.1)</topic>  
      <Text3>Text</Text3>  
      <topic>Überschrift(1.1.2)</topic>  
      <Text3>Text</Text3>  
    </Text2>  
  </Text1>  
  <topic>Überschrift(2)</topic>  
  <Text1>  
    <topic>Überschrift(2.1)</topic>  
    <Text2>Text</Text2>  
  </Text1>  
  <topic>Überschrift(3)</topic>  
  <Text1>  
    <topic>Überschrift(3.1)</topic>  
    <Text2>Text</Text2>  
  </Text1>  
</Buch>  

Habt ihr eine Idee wie ich das anstellen könnte? Am besten auch durchnummeriert. ICh komme ein wenig damit ins schleudern, dass die Überschriften auf einer ebene mit den textbausteinen sind, und nicht einfach als attrubut eingetragen. Leider kann ich an der Struktur der xml nicht ändern.

Vielen Dank schonmal

  1. So kann dir kaum einer helfen, zeig mal dein bisheriges XSL

    1. Hi,

      also weit bin ich noch nicht gekommen. Es geht mir nur darum die Überschriften darzustellen. das was in den texten drin steht ist erstmal uninteressant.
      Ich dachte mir es sollte doch möglich sein dass das inhaltsverzeichnis wie folgt dargestellt wird:

      1. Überschrift
      1.1 Überschrift
      1.1.1 Überschrift
      1.2 Überschrift
      usw....

      erste ansätze bei mir waren jetzt so:

        <xsl:template match="Buch">  
        
          <ol>  
            <xsl:for-each select="topic">  
              <li>  
                <xsl:apply-templates select="."/>  
              </li>  
        
              <ol>  
                <xsl:for-each select="/*/topic">  
                  <li>  
                    <xsl:apply-templates select="."/>  
                  </li>  
                </xsl:for-each>  
              </ol>  
        
            </xsl:for-each>  
          </ol>  
        </xsl:template>
      

      aber da werdet ihr sehen, dass das in keinster weise dme ergebnis entspricht.
      wegen der nummerierung hab ich irgendwo im forum lösungen mit xsl:number gelesen.

      Wäre nett wenn ihr mir helfen könntet.

      danke.

  2. Ein kleine Anregung wie man es machen koennte (ausgabe als xhtml fuer browser ansicht)

      
    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
        <xsl:output method="xml"/>  
        <xsl:template match="/">  
            <html>  
                <head/>  
                <body>  
                    <h1>Inhaltsverzeichnis</h1>  
                    <!-- Schreibe das Inhaltsverzeichnis -->  
                    <xsl:apply-templates select="descendant::topic" mode="Inhaltsverzeichnis"/>  
                    <!--  
      
                        Mache nachfolgend ....  
      
                        -->  
                </body>  
            </html>  
        </xsl:template>  
        <!-- Templates fuer Ueberschrift -->  
        <xsl:template match="topic" mode="Inhaltsverzeichnis">  
            <p>  
                <!-- Ermittle Ueberschrift Nummer -->  
                <b>  
                    <xsl:apply-templates select="current()" mode="Verzeichnisnummer"/>  
                </b>  
                <!-- Schreibe Ueberschrift -->  
                <xsl:text> </xsl:text>  
                <xsl:value-of select="."/>  
            </p>  
        </xsl:template>  
        <!-- Template fuer rekursive Ermittlung -->  
        <xsl:template match="topic" mode="Verzeichnisnummer">  
            <xsl:param name="Index"/>  
            <xsl:choose>  
                <xsl:when test="parent::*/preceding-sibling::topic">  
                    <xsl:apply-templates select="parent::*/preceding-sibling::topic[position() = 1]" mode="Verzeichnisnummer">  
                        <xsl:with-param name="Index" select="concat('.',count(preceding-sibling::topic) + 1,$Index)"/>  
                    </xsl:apply-templates>  
                </xsl:when>  
                <xsl:otherwise>  
                    <xsl:value-of select="concat(count(preceding-sibling::topic) + 1,$Index)"/>  
                </xsl:otherwise>  
            </xsl:choose>  
        </xsl:template>  
    </xsl:stylesheet>  
    
    

    Bedenke jedoch, dass viele Applikationen listenelement haben, bei denen die Nummerierung automatisch vorgenommen wird. Fuer html code siehe z.B.:

    <http://de.selfhtml.org/html/text/listen.htm#nummeriert@title=nummerierte Listen>

    Gruss, Holge r