jens: XSLT-Sortierung / Zusammenfasssung nach Elementnamen

Beitrag lesen

Hallo Thomas,

Mit dem gewünschten Ausgabeform in der Tabelle (das ist das eigentliche Problem): nein, im Moment weiss ich es auch nicht (habe ein wenig zwar experimentiert, aber nicht wirklich Zeit dazu gehabt).
Aber es ist wirklich eine sehr interssante Frage, so dass es mich jetzt auch "gepackt" hat die Antwort herauszufinden.

hier das versprochene XSLT. Wenn Dir was negativ auffältt, lass es mich wissen:

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

<!-- Anzahl Artikel pro Seite -->

<xsl:variable name="posPerPage" select="10"/>

<!-- Nach entsprechenden gleichen Elementen zusammengefasste Untermengen -->

<xsl:key name="folgenr" match="Table" use="folgenr"/>
<xsl:key name="zuordnung" match="Table" use="zuordnung"/>

<!-- Haupttemplate -->

<xsl:template match="/">
<xsl:for-each select="//Table[generate-id(.) = generate-id(key('folgenr',folgenr))]">
 <xsl:if test="position() mod $posPerPage = 0 or position() = 1">
 xsl:choose
 <xsl:when test="position() = 1">
  <xsl:call-template name="newTable">
  <xsl:with-param name="start" select="number(position())" />
  <xsl:with-param name="end" select="number(position() + $posPerPage -1 )" />
  </xsl:call-template>
 </xsl:when>
 xsl:otherwise
  <xsl:call-template name="newTable">
  <xsl:with-param name="start" select="number(position() +1)" />
  <xsl:with-param name="end" select="number((position()) +  $posPerPage)" />
  </xsl:call-template>
 </xsl:otherwise>
 </xsl:choose>
 </xsl:if>
</xsl:for-each>
</xsl:template>

<!-- Template für einzelne Tabellen
  Uebergabeparameter: Start-Position, End-Position -->

<xsl:template name="newTable">
<xsl:param name="start" />
<xsl:param name="end" />
<br/>
Artikel <xsl:value-of select="$start"/> bis <xsl:value-of select="$end"/><br/><br/>
<!-- Link zur nächsten Tabelle -->

<a name="{$start}"></a>
<!-- <a href="#{$end+1}"><font class="h1">Nächste Seite</font></a> -->
<!-- <br/><br/> -->
<!-- Tabelle -->

<table class="h1" cellspacing="0" cellpadding="1" border="1">
<tr>
 <td valign="bottom">Artikel<br></br>Zuordnung</td><td>Fakt.</td>

<!-- Artikel -->

<xsl:for-each select="//Table[generate-id(.) = generate-id(key('folgenr',folgenr))]">
  <xsl:if test="position() >= $start">
   <xsl:if test="position() <= $end">
    <td width="{round(875 div ($posPerPage+1))}px" height="100px" align="center" valign="top"><xsl:value-of select="artikelgruppe"/><br/><br/><xsl:value-of select="artikel"/></td>
   </xsl:if>
  </xsl:if>
 </xsl:for-each>
</tr>

<!-- Zuordnung und Faktor -->

<xsl:for-each select="//Table[generate-id(.) = generate-id(key('zuordnung',zuordnung))]">
<tr>
<td width="125px" align="left"><xsl:value-of select="substring(zuordnung,1,30)"/></td>
<td align="center"><xsl:value-of select="./faktor"/></td>

<!-- Multiplikatoren und Mengen pro Zuordnung -->

<xsl:for-each select="key('zuordnung', zuordnung)">
<xsl:if test="position() >= $start">
 <xsl:if test="position() <= $end">
  <td>
   <table class="h1" width="100%">
    <tr>
    <td>
     <table class="h1" width="100%" cellspacing="0" cellpadding="0">
      <tr><td align="left"><xsl:value-of select="./anzahl"/></td></tr>
     </table>
    </td>
    <td>
     <table class="h1"  width="100%" cellspacing="0" cellpadding="0">
     <tr><td align="right"> <xsl:value-of select="./menge"/></td></tr>
     </table>
    </td>
    </tr>
   </table>
  </td>
 </xsl:if>
</xsl:if>
</xsl:for-each>
</tr>
</xsl:for-each>

<!-- Gesamtsumme pro Artikel -->

<tr><td><b>Gesamtsumme</b></td><td align="center"><b>=</b></td>
<xsl:for-each select="//Table[generate-id(.) = generate-id(key('folgenr',folgenr))]">
<xsl:if test="position() >= $start">
 <xsl:if test="position() <= $end">
  <xsl:for-each select="key('folgenr', folgenr)">
  <xsl:if test="position() = last()">
   <td align="right"><b><xsl:value-of select="gesamtmenge"/></b></td>
  </xsl:if>
  </xsl:for-each>
 </xsl:if>
</xsl:if>
</xsl:for-each>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>