nero: Verschachtelung von group-Funktionen

Hallo Forum-Nutzer,

seit einiger Zeit schlage ich mich mit einem Problem rum, welches ich einfach nicht lösen kann - zwar hatte ich zahlreiche Ideen, nur bringen die nicht das gewünschte Ergebnis.

Angenommen folgende XML-Datei ist gegeben:

<root>
    <heading1>Headline1</heading1>
    <para>Text</para>
    <para>Text</para>
    <listelement pos="1">first-1</listelement>
    <listelement pos="2">second-1</listelement>
    <listelement pos="3">third-1</listelement>
    <para>Text</para>
    <para>Text</para>
    <heading2>Headline2-1</heading2>
    <para>Text</para>
    <para>Text</para>
    <para>Text</para>
    <listelement pos="1">first-2</listelement>
    <listelement pos="2">second-2</listelement>
    <listelement pos="3">third-2</listelement>
    <para>Text</para>
    <heading2>Headline2-2</heading2>
    <para>Text</para>
    <listelement pos="1">first-3</listelement>
    <listelement pos="2">second-3</listelement>
    <para>Text</para>
    <para>Text</para>
</root>

Nun sollen zwei Strukturierungsvorgänge durchgeführt werden:
1. An Hand der Headings wird eine verschachtelte Struktur erstellt - das funktioniert auch.
2. Die Listenelemente sollen zu einer Liste gruppiert werden - funktioniert auch, aber es funktioniert eben nicht beides zusammen.

Hier die XSL-Datei:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output indent="yes" method="xml"/>
    <xsl:template match="/">
        <sect1>
            <xsl:call-template name="struktur"/>
        </sect1>
    </xsl:template>

<xsl:template name="struktur">
    <xsl:for-each-group select="//para|//heading1|//heading2|//listelement" group-starting-with="heading2">
        xsl:choose
            <xsl:when test="current()[self::heading2]">
                <sect2>
                    <xsl:apply-templates select="current-group()"/>
                </sect2>
            </xsl:when>
            xsl:otherwise
                <xsl:apply-templates select="current-group()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each-group>
</xsl:template>

<xsl:template name="liste">
    <xsl:for-each-group select="//listelement" group-starting-with="listelement[@pos='1']">
            <liste>
                        <xsl:apply-templates select="current-group()"/>
            </liste>
    </xsl:for-each-group>
   </xsl:template>

<xsl:template match="heading1">
        <title>
            xsl:apply-templates/
        </title>
    </xsl:template>

<xsl:template match="heading2">
        <title>
            xsl:apply-templates/
        </title>
    </xsl:template>

<xsl:template match="para">
        <p>
            xsl:apply-templates/
        </p>
    </xsl:template>

<xsl:template match="listelement">
        <li>
            xsl:apply-templates/
        </li>
    </xsl:template>
</xsl:stylesheet>

Das Template namens liste würde ich gern irgenwie im Template struktur aufrufen. Aber ich weiß nicht, ob das der richtige Ansatz ist.

Für Hilfe wäre ich dankbar. Denn im Netz hab ich nichts gefunden oder in Büchern auch nicht - da waren es immer nur einfache Gruppierungen.

Mfg nero

  1. Hallo,

    Kannst du uns vielelicht auch angeben, wie die ziel xml datei aussehen soll? denn so wie du das templatze aufbaust, habe ich keine ahnung, was du erreichen moechtest.

    1. Ach ja, dass Ziel soll folgendermaßen aussehen:

      <?xml version="1.0" encoding="UTF-8"?>
      <sect1>
         <title>Headline1</title>
         <p>Text</p>
         <p>Text</p>
         <liste>
            <li>first-1</li>
            <li>second-1</li>
            <li>third-1</li>
         </liste>
         <p>Text</p>
         <p>Text</p>
         <sect2>
            <title>Headline2-1</title>
            <p>Text</p>
            <p>Text</p>
            <p>Text</p>
            <liste>
               <li>first-2</li>
               <li>second-2</li>
               <li>third-2</li>
            </liste>
            <p>Text</p>
         </sect2>
         <sect2>
            <title>Headline2-2</title>
            <p>Text</p>
            <liste>
               <li>first-3</li>
               <li>second-3</li>
            </liste>
            <p>Text</p>
            <p>Text</p>
         </sect2>
      </sect1>

      Also, die Strukturierung erfolgt mittels sect1 und sect2, wobei sect1 ja das Wurzelelement ist (1. Vorgang). Dann sollen die Listen in die jeweilige Hierarchieebene einfließen (Kind von sect 1 oder sect 2)(2.Vorgang). Aber wie - das ist meine Frage.

      nero