XSL => Tabelle => Cols
Charli
- xsl
0 Holge r
Hallo Gemeinde!
Ich habe mehrere Tabellen zwischen 1 und 7 Spalten innerhalb eines XML Dokuments.
Aufgabe ist: Die breite der Zellen <TD> in <THEAD> und <TBODY> dynamisch aus <COL width="xx%"/> zu erzeugen und die Ausrichtung in <THEAD> und <TBODY> dynamisch zu Erzeugen <TD align="xx"/>
Meine XML Datei
<TABLE> <COL width="40%"/> <COL width="20%"/> <COL width="20%"/> <COL width="20%"/> <THEAD> <TR> <TD align="center"/> <TD align="center">bis zu einem Jahr EUR</TD> <TD align="center">zwischen einem und fünf Jahren<nZ/>EUR</TD> <TD align="center">mehr als 5 Jahre EUR</TD> </TR> </THEAD> <TBODY> <TR> <TD align="left"/> <TD align="center"/> <TD align="center"/> <TD align="center">0,00</TD> </TR> <TR> <TD align="left"/> <TD align="center"/> <TD align="center"/> <TD align="center">0,00</TD> </TR> </TBODY> </TABLE>
<TABLE> <COL width="66%"/> <COL width="17%"/> <COL width="17%"/> <THEAD> <TR> <TD align="left"/> <TD align="center">31.12.2006 <nZ/>EUR</TD> <TD align="center">31.12.2005 <nZ/>EUR</TD> </TR> </THEAD> <TBODY> <TR Hervorhebung="Hauptgruppe"> <TD align="left"><b>Umlaufvermögen</b></TD> <TD align="center"/> <TD align="right"/> </TR> <TR> <TD align="left">Zur Veräußerung bestimmte Anlagegegenstände</TD> <TD align="center"/> <TD align="right"/> </TR> <TR Hervorhebung="Summe"> <TD align="left"/> <TD align="right">5.604.623,97</TD> <TD align="right">7.824.666,55</TD> </TR> <TR> <TD align="left">Kassenbestand und Guthaben bei Kreditinstituten</TD> <TD align="right">2.540.493,04</TD> <TD align="right">1.244.653,27</TD> </TR> </TBODY> </TABLE>
Meine XSL Datei
<xsl:template match="TABLE/THEAD"> <!-- in jeder Zeile /tr) die Anzahl von Zellen (td). Die Erste Zeile nehmen --> <xsl:variable name="Anzahl_td" select="count(TR[1]/TD)"/> <table style="width:750px; margin-bottom:0px;"> <xsl:for-each select="TR"> xsl:choose <xsl:when test="($Anzahl_td) = 1"> <tr> <td><xsl:value-of select="TD[1]"/></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 2"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 3"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td> <xsl:value-of select="TD[2]"/> <br /> xsl:text </xsl:text> </td> <td> <xsl:value-of select="TD[3]"/> <br /> xsl:text </xsl:text> </td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 4"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> <td><xsl:value-of select="TD[4]"/></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 5"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> <td><xsl:value-of select="TD[4]"/></td> <td><xsl:value-of select="TD[5]"/></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 6"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> <td><xsl:value-of select="TD[4]"/></td> <td><xsl:value-of select="TD[5]"/></td> <td><xsl:value-of select="TD[6]"/></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 7"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> <td><xsl:value-of select="TD[4]"/></td> <td><xsl:value-of select="TD[5]"/></td> <td><xsl:value-of select="TD[6]"/></td> <td><xsl:value-of select="TD[7]"/></td> </tr> </xsl:when> xsl:otherwise <xsl:value-of select="." /> </xsl:otherwise>
</xsl:choose> </xsl:for-each> </table> </xsl:template>
<xsl:template match="TABLE/TBODY"> <!-- in jeder Zeile (tr) die Anzahl von Zellen (td). Die erte Zeile nehmen --> <xsl:variable name="Anzahl_td" select="count(TR[1]/TD)"/> <table style="width:750px;"> <xsl:for-each select="TR"> xsl:choose
<!-- Hervorhebung beginn --> <xsl:when test="@Hervorhebung='Hauptgruppe'"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> </tr> </xsl:when> <xsl:when test="@Hervorhebung='Summe'"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> </tr> </xsl:when> <xsl:when test="@Hervorhebung='Zwischensumme'"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> </tr> </xsl:when> <xsl:when test="@Hervorhebung='Hauptposition'"> <tr> <td><xsl:value-of select="TD[1]"/></td> <td><xsl:value-of select="TD[2]"/></td> <td><xsl:value-of select="TD[3]"/></td> </tr> </xsl:when> <!-- Hervorhebung ende -->
<!-- Anzahl der Zellen pro Zeile beginn --> <xsl:when test="($Anzahl_td) = 1"> <tr> <td><xsl:value-of select="TD[1]" /></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 2"> <tr> <td><xsl:value-of select="TD[1]" /></td> <td><xsl:value-of select="TD[2]" /></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 3"> <tr> <td><xsl:value-of select="TD[1]" /></td> <td><xsl:value-of select="TD[2]" /></td> <td><xsl:value-of select="TD[3]" /></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 4"> <tr> <td><xsl:value-of select="TD[1]" /></td> <td><xsl:value-of select="TD[2]" /></td> <td><xsl:value-of select="TD[3]" /></td> <td><xsl:value-of select="TD[4]" /></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 5"> <tr> <td><xsl:value-of select="TD[1]" /></td> <td><xsl:value-of select="TD[2]" /></td> <td><xsl:value-of select="TD[3]" /></td> <td><xsl:value-of select="TD[4]" /></td> <td><xsl:value-of select="TD[5]" /></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 6"> <tr> <td><xsl:value-of select="TD[1]" /></td> <td><xsl:value-of select="TD[2]" /></td> <td><xsl:value-of select="TD[3]" /></td> <td><xsl:value-of select="TD[4]" /></td> <td><xsl:value-of select="TD[5]" /></td> <td><xsl:value-of select="TD[6]" /></td> </tr> </xsl:when> <xsl:when test="($Anzahl_td) = 7"> <tr> <td><xsl:value-of select="TD[1]" /></td> <td><xsl:value-of select="TD[2]" /></td> <td><xsl:value-of select="TD[3]" /></td> <td><xsl:value-of select="TD[4]" /></td> <td><xsl:value-of select="TD[5]" /></td> <td><xsl:value-of select="TD[6]" /></td> <td><xsl:value-of select="TD[7]" /></td> </tr> </xsl:when> xsl:otherwise <xsl:value-of select="." /> </xsl:otherwise> <!-- Anzahl der Zellen pro Zeile ende -->
</xsl:choose> </xsl:for-each> </table> </xsl:template>
Kennt hier jemand eine Lösung bitte?
Vielen Danke Charli
Also das xsl sieht nicht sehr performant aus. Ich wuerde nicht xsl:for-each einsetzen, sondern apply-template select="... Darüber hinaus würde ich mir variablen erzeugen, die pro tabelle etwa anzahl der col und wert der aktuellen col ausgeben.
du kannst du werte bestimmen, in dem du mit xpath navigierst und diese zählen lässt. perceding-sibling::* parent::* & co sollten hier weiterhelfen.
Du könntest auf den aktuellen knoten abfragen mit einer eigenen funktion, sofern du xslt2.0 verwendest.