Anzahl der Spalten ermitteln
Ziegenpeter
- xsl
Hallo Forum,
für die Festlegung Spaltenbreite (column-width="") einer Tabelle brauche ich die Anzahl der td`s aus dem XML. Ich habe hier einen kläglichen Versuch mit einer Variablen und for-each:
<xsl:template match="table/tr/td">
<fo:block >
<fo:table width="100%" padding-after="1cm" >
<xsl:for-each select="td">
<xsl:variable name="Anzahl_td" select="count(td)"/>
xsl:choose
<xsl:when test="{$Anzahl_td}= 5">
<fo:table-column column-width="4cm" />
</xsl:when>
<xsl:when test="{$Anzahl_td}= 4">
<fo:table-column column-width="4.5cm" />
</xsl:when>
<xsl:when test="{$Anzahl_td}= 3">
<fo:table-column column-width="5.5cm" />
</xsl:when>
<xsl:when test="{$Anzahl_td}= 2">
<fo:table-column column-width="6.5cm" />
</xsl:when>
xsl:otherwise
<fo:table-column column-width="7cm" />
</xsl:otherwise>
</xsl:choose>
Kann mir jemand helfen?
Gruß
Peter Z.
Hallo,
für die Festlegung Spaltenbreite (column-width="") einer Tabelle brauche ich die Anzahl der td`s aus dem XML. Ich habe hier einen kläglichen Versuch mit einer Variablen und for-each:
<xsl:template match="table/tr/td">
<fo:block >
<fo:table width="100%" padding-after="1cm" >
Damit würdest du für jede Tabellenzeille (aus dem XML) eine Tabelle im PDf erzeugen.
<xsl:template match="table">
<fo:block >
<fo:table width="100%" padding-after="1cm">
<xsl:for-each select="td">
<xsl:variable name="Anzahl_td" select="count(td)"/>
Anzahl_td wird so glewich aus zwei Gründen immer null sein:
Also:
<xsl:template match="table">
jetzt kommt es darauf an, ob du in jeder Zeile (tr) die gleiche Anzahl von Zellen (td) hast. Sagen wir du nimmst die erte Zeile:
<xsl:variable name="Anzahl_td" select="count(tr[1]/td)"/>
<fo:block >
<fo:table width="100%" padding-after="1cm">
Der Rest kann bleiben wie vorher:
xsl:choose
<xsl:when test="{$Anzahl_td}= 5">
<fo:table-column column-width="4cm" />
</xsl:when>
...
</xsl:choose>
Grüße
Thomas
Vielen Dank für die Antwort Thomas.
Ich muß noch einiges lernen
Gruß
ZP
So hab ich es jetzt gemacht, und funktioniert
<xsl:template match="table[@type='fromTable']">
<xsl:variable name="Anzahl_td" select="count(tr[1]/td[@class='bold'])"/>
fo:block
<fo:table width="100%" padding-after="1cm" >
<xsl:for-each select="tr/td">
<!--
<xsl:value-of select="count($Anzahl_tr)"/>
<xsl:value-of select="count(tr)"/>
<xsl:variable name="Anzahl_td" select="count(tr[1]/td)"/>
-->
xsl:choose
<xsl:when test="($Anzahl_td) = 5">
<fo:table-column column-width="4cm" />
</xsl:when>
<xsl:when test="($Anzahl_td) = 4">
<fo:table-column column-width="4.5cm" />
</xsl:when>
<xsl:when test="($Anzahl_td) = 3">
<fo:table-column column-width="5.5cm" />
</xsl:when>
<xsl:when test="($Anzahl_td) = 2">
<fo:table-column column-width="6.5cm" />
</xsl:when>
<xsl:when test="($Anzahl_td) = 1">
<fo:table-column column-width="7cm" />
</xsl:when>
xsl:otherwise
<fo:table-column column-width="1cm" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
usw...
Hallo,
So hab ich es jetzt gemacht, und funktioniert
<xsl:template match="table[@type='fromTable']">
<xsl:variable name="Anzahl_td" select="count(tr[1]/td[@class='bold'])"/>fo:block
<fo:table width="100%" padding-after="1cm" ><xsl:for-each select="tr/td">
Das müsste eignetlich auch schlimm werden, weil du eigentlich so für jede Zelle in der Tabelle die fo:table-column erzeugst.
Da würde ich es auch begrenzen:
<xsl:for-each select="tr[1]/td[@class='bold']">
damit nur genau so viele fo:table-columns erzeugt werden, wie Anzahl von (benötigten) Zellen es gibt.
Grüße
Thomas