Ziegenpeter: Anzahl der Spalten ermitteln

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.

  1. 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:

    • mit <xsl:template match="table/tr/td"> bist du bereits im <td> darin mit <xsl:for-each select="td"> bringt null Treffer, und dann
    • versuchst nochmal in tds 8die eas gar nicht gibt) weitere tds zu zählen: <xsl:variable name="Anzahl_td" select="count(td)"/>, was natürlich auch immer null sein wird.

    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

    1. Vielen Dank für die Antwort Thomas.
      Ich muß noch einiges lernen
      Gruß
      ZP

      1. 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...

        1. 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