XSLT-Elemente

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

 

xsl:for-each-group

Die Instruktion xsl:for-each-group dient dazu eine im select-Attribut angegebene Eingabesequenz anhand eines Kriteriums zu gruppieren. Hierbei werden alle Items denen der gleiche Wert für das ausgewählte Kriterium zugeordnet wird, zu einer Gruppe zusammengefasst. Das Kriterium wird mittels des group-by- oder group-adjacent-Attributs angegeben. Hierbei wird ein relativer Ausdruck angegeben, der auf jedes Item der Eingabesequenz angewandt wird. Dabei wird das Item als jeweiliges Kontextitem betrachtet und der ermittelte Wert diesem zugeordnet.

Der Unterschied zwischen group-by und group-adjacent ist, dass bei group-by alle Knotenitems, die den gleichen Wert haben, einer Gruppe zugeordnet werden, während bei group-adjacent nur alle aufeinanderfolgenden gleichen Werte einer Gruppe zugeordnet werden. Die Reihenfolge ist die gleiche wie in der Eingabesequenz, kann jedoch mit der xsl:sort-Instruktion entsprechend verändert werden.

Alternativ zu group-by und group-adjacent kann die Eingabesequenz durch die Attribute group-starting-with und group-ending-with gruppiert werden. Hierbei werden alle Elemente die nach einem bei group-starting-with angegebenen Knotens (inklusive diesem) und vor dem nächsten gleichen Knoten stehen einer Gruppe zugeordnet werden.

Der Inhalt des xsl:for-each-group-Elements wird für jede Gruppe angewandt. Die Gruppe wird dabei als Teilsequenz ausgegeben. Abgerufen werden kann sie durch die XPath-Funktion current-group().

Kindelemente

xsl:sort MMP, 20090708

Attribute

select, group-by, group-adjacent, group-starting-with, group-ending-with, collation

Beispiel 1

<?xml version="1.0"encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="root">
        <html>
            <head>
                <title>for-each</title>
            </head>
            <body>
      <p>
        <xsl:for-each-group select="stadt" group-by="@land">
          <group>
            <key>
            <xsl:value-of select="current-grouping-key()">
            </xsl:value-of>
            <key>
            <xsl:for-each select="current-group()">
            <stadt>
            <xsl:value-of select="name"></xsl:value-of>
            </stadt>
            </xsl:for-each>
          </group>
        </xsl:for-each-group>
      </p>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Beispiel 2

<?xml version="1.0"encoding="UTF-8"?>
<root>
    <stadt land="de">
        <name>Berlin</name>
        <einwohner>3420786</einwohner>
        <fläche>891.85</fläche>
        <gemeinde>11000000</gemeinde>
        <bewertung>5</bewertung>
    </stadt>
    <stadt land="de">
        <name>Hamburg</name>
        <einwohner>1773218</einwohner>
        <fläche>755.264</fläche>
        <gemeinde>02000000</gemeinde>
        <bewertung>4</bewertung>
    </stadt>
    <stadt land="fr">
        <name>Paris</name>
        <einwohner>2166200</einwohner>
        <fläche>105.40</fläche>
        <bewertung>3</bewertung>
    </stadt>
    <stadt land="de">
        <name>Ludwigshafen</name>
        <einwohner>163777</einwohner>
        <fläche>77.68</fläche>
        <bewertung>-3</bewertung>
    </stadt>
</root>
<?xml version="1.0"encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="root">
        <verzeichnis>
            <xsl:for-each-group select="stadt" group-by="@land">
                <group>
                    <key>
                        <xsl:value-of select="current-grouping-key()"></xsl:value-of>
                    </key>
                    <xsl:for-each select="current-group()">
                        <stadt>
                            <xsl:value-of select="name"></xsl:value-of>
                        </stadt>
                    </xsl:for-each>
                </group>
            </xsl:for-each-group>
        </verzeichnis>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0"encoding="UTF-8"?>
<verzeichnis>
    <group>
        <key>de</key>
        <stadt>Berlin</stadt>
        <stadt>Hamburg</stadt>
        <stadt>Ludwigshafen</stadt>
    </group>
    <group>
        <key>fr</key>
        <stadt>Paris</stadt>
    </group>
</verzeichnis>

Beispiel 3

<?xml version="1.0"encoding="UTF-8"?>
<root>
    <stadt land="de">
        <name>Berlin</name>
        <einwohner>3420786</einwohner>
        <fläche>891.85</fläche>
        <gemeinde>11000000</gemeinde>
        <bewertung>5</bewertung>
    </stadt>
    <stadt land="de">
        <name>Hamburg</name>
        <einwohner>1773218</einwohner>
        <fläche>755.264</fläche>
        <gemeinde>02000000</gemeinde>
        <bewertung>4</bewertung>
    </stadt>
    <stadt land="fr">
        <name>Paris</name>
        <einwohner>2166200</einwohner>
        <fläche>105.40</fläche>
        <bewertung>3</bewertung>
    </stadt>
    <stadt land="de">
        <name>Ludwigshafen</name>
        <einwohner>163777</einwohner>
        <fläche>77.68</fläche>
        <bewertung>-3</bewertung>
    </stadt>
</root>
<?xml version="1.0"encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="root">
        <verzeichnis>
            <xsl:for-each-group select="stadt" group-adjacent="@land">
                <group>
                    <key>
                        <xsl:value-of select="current-grouping-key()"></xsl:value-of>
                    </key>
                    <xsl:for-each select="current-group()">
                        <stadt>
                            <xsl:value-of select="name"></xsl:value-of>
                        </stadt>
                    </xsl:for-each>
                </group>
            </xsl:for-each-group>
        </verzeichnis>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0"encoding="UTF-8"?>
<verzeichnis>
    <group>
        <key>de</key>
        <stadt>Berlin</stadt>
        <stadt>Hamburg</stadt>
    </group>
    <group>
        <key>fr</key>
        <stadt>Paris</stadt>
    </group>
    <group>
        <key>de</key>
        <stadt>Ludwigshafen</stadt>
    </group>
</verzeichnis>

Beispiel 4

<?xml version="1.0"encoding="UTF-8"?>
<root>
    <stadt land="de">
        <name>Berlin</name>
        <einwohner>3420786</einwohner>
        <fläche>891.85</fläche>
        <gemeinde>11000000</gemeinde>
        <bewertung>5</bewertung>
    </stadt>
    <stadt land="de">
        <name>Hamburg</name>
        <einwohner>1773218</einwohner>
        <fläche>755.264</fläche>
        <gemeinde>02000000</gemeinde>
        <bewertung>4</bewertung>
    </stadt>
    <stadt land="fr">
        <name>Paris</name>
        <einwohner>2166200</einwohner>
        <fläche>105.40</fläche>
        <bewertung>3</bewertung>
    </stadt>
    <stadt land="de">
        <name>Ludwigshafen</name>
        <einwohner>163777</einwohner>
        <fläche>77.68</fläche>
        <bewertung>-3</bewertung>
    </stadt>
</root>
<?xml version="1.0"encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:template match="root">
    <verzeichnis>
      <block>
      <xsl:for-each-group select="stadt" group-adjacent="@land">
      <xsl:sort select="current-grouping-key()"></xsl:sort>
        <group>
          <key>
          <xsl:value-of select="current-grouping-key()">
          </xsl:value-of>
          </key>
          <xsl:for-each select="current-group()">
          <stadt>
          <xsl:value-of select="name"></xsl:value-of>
          </stadt>
          </xsl:for-each>
        </group>
      </xsl:for-each-group>
      </block>
      <block>
      <xsl:for-each-group select="stadt" group-by="@land">
      <xsl:sort select="sum(current-group()/einwohner)"></xsl:sort>
        <group>
          <key>
          <xsl:value-of select="current-grouping-key()">
          </xsl:value-of>
          </key>
          <xsl:for-each select="current-group()">
          <stadt>
          <xsl:value-of select="name"></xsl:value-of>
          </stadt>
          </xsl:for-each>
        </group>
      </xsl:for-each-group>
      </block>
    </verzeichnis>
  </xsl:template>
</xsl:stylesheet>
<?xml version="1.0"encoding="UTF-8"?>
<verzeichnis>
    <block>
        <group>
            <key>de</key>
            <stadt>Berlin</stadt>
            <stadt>Hamburg</stadt>
        </group>
        <group>
            <key>de</key>
            <stadt>Ludwigshafen</stadt>
        </group>
        <group>
            <key>fr</key>
            <stadt>Paris</stadt>
        </group>
    </block>
    <block>
        <group>
            <key>fr</key>
            <stadt>Paris</stadt>
        </group>
        <group>
            <key>de</key>
            <stadt>Berlin</stadt>
            <stadt>Hamburg</stadt>
            <stadt>Ludwigshafen</stadt>
        </group>
    </block>
</verzeichnis>

Beispiel 5

<?xml version="1.0"encoding="UTF-8"?>
<buch>
    <title>Title 1</title>
  <para>
  Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte, 
  fand er sich in seinem Bett zu einem ungeheueren Ungeziefer 
  verwandelt.
  </para>
  <para>
  Er lag auf seinem panzerartig harten Rücken und sah, wenn er den 
  Kopf ein wenig hob, seinen gewölbten, braunen, von bogenförmigen 
  Versteifungen geteilten Bauch, auf dessen Höhe sich die Bettdecke, 
  zum gänzlichen Niedergleiten bereit, kaum noch erhalten konnte.
  </para>
  <para>
  Seine vielen, im Vergleich zu seinem sonstigen Umfang kläglich 
  dünnen Beine flimmerten ihm hilflos vor den Augen.
  </para>
    <title>Title 2</title>
  <para>
  »Was ist mit mir geschehen?«, dachte er. Es war kein Traum.
  </para>
  <para>
  Sein Zimmer, ein richtiges, nur etwas zu kleines Menschenzimmer, 
  lag ruhig zwischen den vier wohlbekannten Wänden.
  </para>
  <para>
  Über dem Tisch, auf dem eine auseinandergepackte Musterkollektion 
  von Tuchwaren ausgebreitet war - Samsa war Reisender - hing das Bild, 
  das er vor kurzem aus einer illustrierten Zeitschrift ausgeschnitten 
  und in einem hübschen, vergoldeten Rahmen untergebracht hatte.
  </para>
  <para>
  Es stellte eine Dame dar, die mit einem Pelzhut und einer Pelzboa versehen, 
  aufrecht dasaß und einen schweren Pelzmuff, in dem ihr ganzer Unterarm 
  verschwunden war, dem Beschauer entgegenhob.
  </para>
    <title>Title 3</title>
  <para>
  Gregors Blick richtete sich dann zum Fenster, und das trübe 
  Wetter - man hörte Regentropfen auf das Fensterblech aufschlagen - machte 
  ihn ganz melancholisch. »Wie wäre es, wenn ich noch ein wenig weiterschliefe 
  und alle Narrheiten vergäße«, dachte er, aber das war gänzlich 
  undurchführbar, denn er war gewöhnt, auf der rechten Seite zu schlafen, 
  konnte sich aber in seinem gegenwärtigen Zustand nicht in diese Lage bringen.
  </para>
</buch>
<?xml version="1.0"encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="buch">
        <article>
            <xsl:for-each-group select="./*" group-starting-with="title">
                <section>
                    <xsl:copy-of select="current-group()"></xsl:copy-of>
                </section>
            </xsl:for-each-group>
        </article>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0"encoding="UTF-8"?>
<article>
    <section>
        <title>Title 1</title>
    <para>
    Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte, 
    fand er sich in seinem Bett zu einem ungeheueren Ungeziefer 
    verwandelt.
    </para>
    <para>
    Er lag auf seinem panzerartig harten Rücken und sah, wenn 
    er den Kopf ein wenig hob, seinen gewölbten, braunen, von 
    bogenförmigen Versteifungen geteilten Bauch, auf dessen Höhe sich 
    die Bettdecke, zum gänzlichen Niedergleiten bereit, kaum noch 
    erhalten konnte.
    </para>
    <para>
    Seine vielen, im Vergleich zu seinem sonstigen Umfang kläglich 
    dünnen Beine flimmerten ihm hilflos vor den Augen.
    </para>
    </section>
    <section>
        <title>Title 2</title>
    <para>
    »Was ist mit mir geschehen?«, dachte er. Es war kein Traum.
    </para>
    <para>
    Sein Zimmer, ein richtiges, nur etwas zu kleines Menschenzimmer, 
    lag ruhig zwischen den vier wohlbekannten Wänden.
    </para>
    <para>
    Über dem Tisch, auf dem eine auseinandergepackte Musterkollektion 
    von Tuchwaren ausgebreitet war - Samsa war Reisender - hing das Bild, 
    das er vor kurzem aus einer illustrierten Zeitschrift ausgeschnitten 
    und in einem hübschen, vergoldeten Rahmen untergebracht hatte.
    </para>
    <para>
    Es stellte eine Dame dar, die mit einem Pelzhut und einer Pelzboa 
    versehen, aufrecht dasaß und einen schweren Pelzmuff, in dem ihr 
    ganzer Unterarm verschwunden war, dem Beschauer entgegenhob.
    </para>
    </section>
    <section>
        <title>Title 3</title>
    <para>
    Gregors Blick richtete sich dann zum Fenster, und das trübe 
    Wetter - man hörte Regentropfen auf das Fensterblech 
    aufschlagen - machte ihn ganz melancholisch. »Wie wäre es, wenn ich 
    noch ein wenig weiterschliefe und alle Narrheiten vergäße«, 
    dachte er, aber das war gänzlich undurchführbar, denn er war gewöhnt, 
    auf der rechten Seite zu schlafen, konnte sich aber in seinem 
    gegenwärtigen Zustand nicht in diese Lage bringen.
    </para>
    </section>
</article>

 

 

  > nach oben
   
  > zurück zur alphabetischen Liste der XSLT Elemente