Julian von Mendel: Nummerierung im Inhaltsverzeichnis - xsl:number

Hi,

ich muss mit XSLT ein Inhaltsverzeichnis nummerieren. Folgende XML-Quelldaten:

[code:xml]
<chapter name="Kapitelname1">
  <section>
     <slide title="Seitenname1">Inhalt</slide>
     <slide title="Seitenname2">Inhalt</slide>
  </section>
  <section>
     <slide title="Seitenname3">Inhalt</slide>
     <slide title="Seitenname4">Inhalt</slide>
  </section>
</chapter>
<chapter name="Kapitelname2">
  <section>
     <slide title="Seitenname5">Inhalt</slide>
     <slide title="Seitenname6">Inhalt</slide>
  </section>
  <section>
     <slide title="Seitenname7">Inhalt</slide>
     <slide title="Seitenname8">Inhalt</slide>
  </section>
</chapter>
[/code]

Ich möchte dass sich daraus ein Inhaltsverzeichnis folgender Art ergibt:

Kapitel 1: Kapitelname1
1.1 Seitenname1
1.2 Seitenname2
1.3 Seitenname3
1.4 Seitenname4
Kapitel 2: Kapitelname2
2.1 Seitenname5
2.2 Seitenname6
2.3 Seitenname7
2.4 Seitenname8

Ich habe jetzt in etwa sowas:

[code:xml]
<xsl:for-each select="/slides/chapter">
  Kapitel <xsl:number level="multiple" count="chapter|slide" format="1.1" />: <xsl:value-of select="@name" />
  <xsl:for-each select="section">
    <xsl:for-each select="slide">
       <xsl:number level="multiple" count="chapter|slide" format="1.1" />
       <xsl:value-of select="child::title" />
    </xsl:for-each>
  </xsl:for-each>
</xsl:for-each>
[/code:xml]

Als Ergebnis bekomme ich:

Kapitel 1: Kapitelname1
1.1 Seitenname1
1.2 Seitenname2
1.1 Seitenname3
1.2 Seitenname4
Kapitel 2: Kapitelname2
2.1 Seitenname5
2.2 Seitenname6
2.1 Seitenname7
2.2 Seitenname8

Scheinbar startet er bei jeder section neu. Die sections dienen nur zur Untergruppierung logisch zusammengehörender slides - das XML-Format kann ich außerdem nicht mehr ändern, es gibt schon mehrere hundert Seiten. Jetzt weiß ich nicht wie ich meine
<xsl:number level="multiple" count="chapter|slide" format="1.1" />
-Zeile umformen muss, damit sie unabhängig von den sections funktioniert.

Hat jemand einen Tipp für mich?

Vielen Dank
Julian

--
"Real programmers can write assembly code in any language." - Larry Wall
  1. Hi,

    ist die Frage zu kompliziert oder schlecht gestellt? Hat niemand eine Idee?

    Schöne Grüße
    Julian

    --
    "Real programmers can write assembly code in any language." - Larry Wall
    1. Hallo,

      ist die Frage zu kompliziert oder schlecht gestellt? Hat niemand eine Idee?

      Vielleicht Zeit?

      Wie auch immer: auf so ein XML:
      <?xml version="1.0" encoding="iso-8859-1"?>
      <data>
      <chapter name="Kapitelname1">
        <section>
           <slide title="Seitenname1">Inhalt</slide>
           <slide title="Seitenname2">Inhalt</slide>
        </section>
        <section>
           <slide title="Seitenname3">Inhalt</slide>
           <slide title="Seitenname4">Inhalt</slide>
        </section>
      </chapter>
      <chapter name="Kapitelname2">
        <section>
           <slide title="Seitenname5">Inhalt</slide>
           <slide title="Seitenname6">Inhalt</slide>
        </section>
        <section>
           <slide title="Seitenname7">Inhalt</slide>
           <slide title="Seitenname8">Inhalt</slide>
        </section>
      </chapter>
      </data>

      das folgende Stylesheet angewendet:

      <?xml version="1.0" encoding="iso-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/data">
      <html>
      <head>
       <title>Untitled</title>
      </head>
      <body>
       <xsl:for-each select="chapter">
        <xsl:variable name="chapternumber">
         <xsl:number level="single" count="chapter" format="1" />
        </xsl:variable>
        <p>
          Kapitel <xsl:value-of select="$chapternumber" />: <xsl:value-of select="@name" /><br />
         <xsl:call-template name="slidegroup">
             <xsl:with-param name="group" select=".//slide" />
          <xsl:with-param name="chapternumber" select="$chapternumber" />
           </xsl:call-template>
        </p>
       </xsl:for-each>
      </body>
      </html>
      </xsl:template>
      <xsl:template name="slidegroup">
       <xsl:param name="group" />
       <xsl:param name="chapternumber" />
       <xsl:for-each select="$group">
        <xsl:value-of select="concat($chapternumber, '.', position(), ' ', @title)" />
          <br />
       </xsl:for-each>
      </xsl:template>
      </xsl:stylesheet>

      erhalte ich als Ergebnis:

      Kapitel 1: Kapitelname1
      1.1 Seitenname1
      1.2 Seitenname2
      1.3 Seitenname3
      1.4 Seitenname4

      Kapitel 2: Kapitelname2
      2.1 Seitenname5
      2.2 Seitenname6
      2.3 Seitenname7
      2.4 Seitenname8

      Grüße
      Thomas

      --
      Surftip: kennen Sie schon Pipolino's Clowntheater?
      http://www.clowntheater-pipolino.net/
      1. Ergänzung:

        Kapitel <xsl:value-of select="$chapternumber" />: <xsl:value-of select="@name" /><br />
           <xsl:call-template name="slidegroup">
               <xsl:with-param name="group" select=".//slide" />
            <xsl:with-param name="chapternumber" select="$chapternumber" />
             </xsl:call-template>
          </p>

        eigentlich reicht ein
        <xsl:for-each select=".//slide">
           <xsl:value-of select="concat($chapternumber, '.', position(), ' ', @title)" />
           <br />
        </xsl:for-each>

        statt dem call-template an dieser Stelle.

        Grüße
        Thomas

      2. Hi Thomas,

        zeit hab ich garnicht mit einbezogen *g*. Es ist in der Tat ein Problem dass alle klugen Menschen mehr Arbeit haben, obwohl man die viel eher gebrauchen könnte *lol*.

        Vielen Dank, das funktioniert gut. Jetzt hab' ich ein ähnliches Problem aber nochmal mit den Slides, wenn diese letztendlich angezeigt werden. Dort soll unten nämlich ebenfalls das Kapitel und der Kapitelabschnitt angezeigt werden. Zu diesem Zweck hab ich mir ein zweites Template mit dem namen slidegoup2 erzeugt, welches keine foreach-Schleife enthält, sondern nur die Zahlen ausgibt. Als Gruppe habe ich ../../section/slide übergeben, weil ich dachte, das würde alle Slides der unterschiedlichen Sektionen erfassen. Tut es jedoch nicht, ich hab das gleiche Nummerierungsproblem wie vorher, weil nach jeder Sektion neugestartet wird. Was muss ich diesmal ändern?

        Schöne Grüße
        Julian

        --
        "Real programmers can write assembly code in any language." - Larry Wall
        1. Hallo Julian,

          zeit hab ich garnicht mit einbezogen *g*. Es ist in der Tat ein Problem dass alle klugen Menschen mehr Arbeit haben, obwohl man die viel eher gebrauchen könnte *lol*.

          ;-)

          Vielen Dank, das funktioniert gut. Jetzt hab' ich ein ähnliches Problem aber nochmal mit den Slides, wenn diese letztendlich angezeigt werden. Dort soll unten nämlich ebenfalls das Kapitel und der Kapitelabschnitt angezeigt werden. Zu diesem Zweck hab ich mir ein zweites Template mit dem namen slidegoup2 erzeugt, welches keine foreach-Schleife enthält, sondern nur die Zahlen ausgibt. Als Gruppe habe ich ../../section/slide übergeben, weil ich dachte, das würde alle Slides der unterschiedlichen Sektionen erfassen.

          Wenn du in einem "slide" bist und "../../section/slide" verwendest, geht das  auf die erste "section" los und zähl dort.

          Vesuche für $group "ancestor::chapter//slide" zu übergeben. Wenn das nicht funktioniert, zeige bitte das zweite Template und wie du diesen aufrufst.

          Grüße
          Thomas

          PS: ab morgen bn ich beim selftreffen, also kann ich entweder noch heute antworten oder am sonntag/montag wieder  ;-)

          1. Hi,

            sorry, ich hab mein Problem falsch beschrieben. Hat sich jetzt aber erledigt, konnte es selbst lösen. Vielen Dank für die Hilfe.

            Schöne Grüße
            Julian

            --
            "Real programmers can write assembly code in any language." - Larry Wall
  2. Hi,

    wenn ich eine Zählervariable hätte, deren Wert ich jede Runde erhöhe, kann ich mir das xsl:number ja auch sparen. Leider gibt es die Fehlermeldung
    xsl:param : redefining zaehler
    wenn ich Versuche einen vorher auf 0 gesetzten Zähler in der foreach-Schleife zu erhöhen. Gibt es da noch eine andere Möglichkeit?

    Schöne Grüße
    Julian

    --
    "Real programmers can write assembly code in any language." - Larry Wall
  3. Hi,

    [code:xml]
    <chapter name="Kapitelname1">
      <section>
         <slide title="Seitenname1">Inhalt</slide>
         <slide title="Seitenname2">Inhalt</slide>
      </section>
      <section>
         <slide title="Seitenname3">Inhalt</slide>
         <slide title="Seitenname4">Inhalt</slide>
      </section>
    </chapter>
    [/code]

    <xsl:for-each select="section">
        <xsl:for-each select="slide">
           <xsl:number level="multiple" count="chapter|slide" format="1.1" />

    Du willst hier nicht nur die slides im aktuellen section zählen, sondern im aktuellen chapter.
    Probier mal
    count="chapter|../../section/slide"
    Also erstmal wieder hoch zum Kapitel und dann die slides in den sections zählen.

    (absolut ungetestet und geraten, kann grad xslt nicht testen)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi MudGuard,

      vielen Dank. Leider erhalte ich folgende Fehlermeldung:

      xsltCompileLocationPathPattern : Name expected
      error: file .inc/generic_handout.xsl line 287 element number
      xsltCompilePattern : failed to compile '../../section/slide'

      Schöne Grüße
      Julian

      --
      "Real programmers can write assembly code in any language." - Larry Wall