XML/XSL-Problem mit verschachtelten Absätzen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML/XSL-Problem mit verschachtelten Absätzen

    Hallo zusammen,

    mein Problem ist wahrscheinlich ein alter Hut, ich hatte auch mal einen Beitrag dazu gefunden, kann ihn aber leider nicht mehr finden. Vielleicht weiß aber jemand einen Rat dazu oder ein Stichwort, unter dem ich suchen kann:

    Ich habe eine XML-Datei mit verschachtelten Absätzen, welche nur Text beinhalten. Es kann vorkommen, daß vor und/oder nach den Child-Elementen Text steht. Also z.B:

    -------------------------------------------------------
    <ABSATZ NAME="Grundlagen">

    Text vor den Unterabschnitten

    <ABSATZ NAME="Technisches">
    technischer Text
    </ABSATZ>

    <ABSATZ NAME="Rechtliches">
    rechtlicher Text
    </ABSATZ>

    Text nach den Unterabschnitten

    </ABSATZ>
    -------------------------------------------------------

    Mein Problem ist nun, daß bei der Verarbeitung durch XSL-Templates der Text vor und nach den Unterabschnitten zusammengefaßt und so ausgegeben wird, was natürlich nicht erwünscht ist. Hier der Code aus der XSL-Datei:

    -------------------------------------------------------
    <h2>Inhalt</h2>

    <xsl:for-each select="//DOC//ABSATZ">
    <h4>

    <xsl:number format="1.1." level="multiple" count="ABSATZ" />
    <xsl:text> </xsl:text>
    <xsl:value-of select="@NAME" />

    </h4>

    <xsl:apply-templates />
    <xsl:value-of select="." />

    </xsl:for-each>
    -------------------------------------------------------

    Ich ahne, daß das Problem in dem Bereich xsl:apply-templates/xsl:value-of select="." liegt. Wie muß ich das anordnen, damit der Text und die Abschnitte gemäß der Struktur des XML-Dokuments ausgegeben werden? Hat jemand eine Idee?

  • #2
    Bin mir nicht ganz sicher, ob ich das Problem richtig verstehe, aber probiert mal das:
    Code:
    <!-- Das "Einstiegs"-Template -->
    <xsl:template match="/*">
    Trullala und Hallo
      <xsl:apply-templates/>
    </xsl:template>
    
    
    <xsl:template match="ABSATZ">
      <!-- Dieser Teil ist ganz wie bei dir -->
      <h4>
        <xsl:number format="1.1." level="multiple" count="ABSATZ" />
        <xsl:text> </xsl:text>
        <xsl:value-of select="@NAME" />
      </h4>
    
      <!-- @select ist deinem Fall wohl optional -->
      <xsl:apply-templates select="ABSATZ"/>
    </xsl:template>
    Dein Ansatz mit xsl:apply-templates ging also schon in die richtige Richtung.
    "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

    Kommentar


    • #3
      Hallo Nezzar,

      danke für Deine Antwort, aber leider funktioniert das nicht. Die Variante mit <xsl:for-each select="//DOC//ABSATZ"> habe ich deshalb versucht, weil ich in der gleichen XSL-Datei bereits ein Template habe, welches auf "ABSATZ" matcht, um ein automatisches Inhaltsverzeichnis zu erstellen. Funktioniert auch ganz prima.

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

      <xsl:template match="ABSATZ">

      <ul class="gliederung">
      <li>
      <a>

      <xsl:attribute name="href">#gl<xsl:number level="any" count="ABSATZ" format="1" /></xsl:attribute>
      <xsl:number level="multiple" count="ABSATZ" format="1.1." />
      <xsl:text> </xsl:text>
      <xsl:value-of select="@NAME" />
      </a>
      </li>

      <xsl:apply-templates select="ABSATZ" />

      </ul>
      </xsl:template>

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

      Dafür ist nun aber die Möglichkeite eines <xsl:template match="ABSATZ"> verbraucht, oder?

      Nachdem ich - für meine laienhaften Anfängerversuche - aber nun schon so sensationell ein Inhaltsverzeichnis hinbekommen habe, hätte ich gerne auch noch den Inhaltstext ordentlich ausgegeben.

      ps: Wie kann ich hier Code-Schnipsel als solche markieren?

      Kommentar


      • #4
        Verstehe. Das macht das ganze natürlich ein wenig komplizierter.
        "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

        Kommentar


        • #5
          Verstehe. Das macht das ganze natürlich ein wenig komplizierter.

          Vielleicht kannst du folgendes probieren: (erscheint mir nicht ganz sauber, aber mir fällt leider gerade nicht's besseres ein)

          Code:
          <xsl:template match="ABSATZ">
            <xsl:param name="ShowContents"/>
          
            <xsl:choose>
              <xsl:when test="$ShowContents = 1">
                <xsl:value-of select="@NAME"/><br/>
                <xsl:value-of select="."/>
          
                <xsl:apply-templates select="ABSATZ">
                  <xsl:with-param name="ShowContents">1</xsl:with-param>
                </xsl:apply-templates>
              </xsl:when>
              <xsl:otherwise>
                <!-- Der Teil ist jetzt genau wie bei dir -->
                <ul class="gliederung">
                  <li>
                    <a>
          
                      <xsl:attribute name="href">#gl<xsl:number level="any" count="ABSATZ" format="1" /></xsl:attribute>
                      <xsl:number level="multiple" count="ABSATZ" format="1.1." />
                      <xsl:text> </xsl:text>
                      <xsl:value-of select="@NAME" />
                    </a>
                  </li>
          
                  <xsl:apply-templates select="ABSATZ" />
          
                </ul>
              </xsl:otherwise>
            </xsl:choose>
          
          </xsl:template>
          PS: Zum Thema Code markieren, siehe hier: http://php-resource.de/forum/misc.ph...on=bbcode#code

          Edit: Den Beitrag über diesen einfach ignorieren, habe versehentlich Alt+S gedrückt (warum kann ich eigentlich meine eigenen Postings nicht löschen?).
          "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

          Kommentar


          • #6
            Hallo Nezzar,

            vielen Dank! Das hat mich schon viel weiter gebracht. Jetzt ist das erste Problem gelöst, d.h. ich kann die Gliederung und den Inhalt in einem XSL-Template abarbeiten und somit auf einer Seite darstellen. Deine Lösung finde ich im übrigen gar nicht so unelegant.

            Hast Du noch eine Idee zum ursprünglichen Problem, nämlich daß bei der Verschachtelung der gesamte Elementinhalt vor den Child-Elementen dargestellt wird, auch wenn er teilweise erst danach kommen soll?

            Besten Dank

            Kommentar

            Lädt...
            X