Andi: Spalten zählen und colspan setzen

Hallo zusammen,

ich habe eine Tabelle, die in den Zeilen entweder eine oder mehrere Spalten haben kann.
Wenn mehrere Spalten vorkommen sind diese immer gleich von der Anzahl, will heißen ich habe grundsätzlich 1 Spalte als Zwischenüberschrift und 6 Spalten bei den Produkten. Es können aber auch bei allen Produkten 7 sein in einer anderen Tabelle.
Nun möchte ich das mein XSL die Anzahl der Spalten zählt und bei der einspaltigen Zeile einen Colspan mit der maximalanzahl an spalten setzt.
Und genau da hakt es. Mein Versuch sieht so aus, bringt aber so gar nicht den gewünschten Effekt.

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

<xsl:variable name="tableheadercolumncount" select="count(tr/td)" />

<xsl:template match="Katalog/Hier/Hier/Agr/Kapiteluebersicht/table">
<xsl:for-each select="tr/td">
   <td>
      <xsl:value-of select="concat('DEBUG',$tableheadercolumncount)" />
      <xsl:value-of select="." />
   </td>
</xsl:for-each>
<p><xsl:copy-of select="$tableheadercolumncount" /></p>
</xsl:template>
</xsl:stylesheet>

Weiß jemand Rat?

  1. Wenn mehrere Spalten vorkommen sind diese immer gleich von der Anzahl, will heißen ich habe grundsätzlich 1 Spalte als Zwischenüberschrift und 6 Spalten bei den Produkten.  Es können aber auch bei allen Produkten 7 sein in einer anderen Tabelle.

    Damit steht ja die maximale Spaltenzahl fest. Alternativ könntest du sie in den verschiedenen Tabellen als Attribut unterbringen (XML ist da ja flexibel). Und deine Einzeiler spannen sich über die komplette Zeile, richtig?

    Weiß jemand Rat?

    Unter oben stehenden Annahmen würde ich das Ganze mit Hilfe von xsl:choose lösen. Mal ein simples Beispiel:

    XML:

    <table max="2">  
      <tr>  
        <td>1.1</td>  
      </tr>  
      <tr>  
        <td>2.1</td>  
        <td>2.2</td>  
      </tr>  
      <tr>  
        <td>3.1</td>  
      </tr>  
      <tr>  
        <td>4.1</td>  
        <td>4.2</td>  
      </tr>  
      <tr>  
        <td>5.1</td>  
      </tr>  
    </table>
    

    Und das XSL dazu:

    <table border="1">  
    <xsl:variable name="gesamt" select="table/@max" />  
    <xsl:for-each select="table/tr">  
      <xsl:variable name="anzahl" select="count(td)" />  
      <xsl:choose>  
        <xsl:when test="$anzahl = 1">  
          <tr>  
            <td>  
              <xsl:attribute name="colspan"><xsl:value-of select="$gesamt" /></xsl:attribute>  
              <xsl:value-of select="td" />  
            </td>  
          </tr>  
        </xsl:when>  
        <xsl:otherwise>  
          <tr>  
          <xsl:for-each select="td">  
            <td>  
              <xsl:value-of select="." />  
            </td>  
          </xsl:for-each>  
          </tr>  
        </xsl:otherwise>  
      </xsl:choose>  
    </xsl:for-each>  
    </table>
    

    Das ergibt genau die Tabelle, wie du sie höchstvermutlich haben willst. Ob das Ganze schöner, besser, eleganter geht, wird Thomas J.S. sicher noch beisteuern :)

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.