ThomasM: group by mit XSLT 1.0

Beitrag lesen

Hallo whine,

dieser Ansatz sollte das Prinzip der Gruppierung und Sortierung zeigen. Sortierung ggf. umkehren (descending) oder weglassen, falls die Reihenfolge des jeweils ersten Auftreten eines Chart-Wertes von Bedeutung ist (also 100 …):

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

  <xsl:output method="html" version="5" encoding="UTF-8"/>

  <xsl:key name="chart_group" match="Chart" use="."/>

  <xsl:template match="/">
    <html>
      <head>
        <title>Test</title>
      </head>
      <body>
        <table>
          <tr>
            <th>Chart</th>
            <th>Fact</th>
            <th>Location</th>
          </tr>
          <xsl:for-each select="//Chart[generate-id() = generate-id(key('chart_group', .)[1])]">
            <xsl:sort select="." data-type="number" order="ascending"/>
            <xsl:variable name="akt_chart" select="."/>
            <xsl:for-each select="//Chart[. = $akt_chart]">
              <tr>
                <td>
                  <xsl:value-of select="$akt_chart"/>
                </td>
                <td>
                  <xsl:value-of select="preceding::Fact[1]"/>
                </td>
                <td>
                  <xsl:value-of select="../../Coordinates"/>
                </td>
              </tr>
            </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

Ausgabe:

<table>
  <tr>
    <th>Chart</th>
    <th>Fact</th>
    <th>Location</th>
  </tr>
  <tr>
    <td>50</td>
    <td>B</td>
    <td>50.6,14.4</td>
  </tr>
  <!-- + 10 tr … -->
  <tr>
    <td>103</td>
    <td>A</td>
    <td>50,14</td>
  </tr>
</table>

Grüße,
Thomas