Once I switched to XSLT 2.0, I was able to get cells into the variable as a
node-set.  Unfortunately, for reasons that are too complicated to explain here,
I can't use XSLT 2.0.  It's fine though, because I figured out how to do it in
XSLT 1.0.

I realized that I should process the data as rows and then cells instead of just
cells.  I had already figured out how to calculate the number of rows, and the
number of columns was static.  I put a sample that I created below in case
anyone else needs the solution.  Please note that the sample may not be the best
way to do it, and it isn't complete.  I just did it as a test so that I could
prove that it could be done with my real data.

Here's is my XML (modified from what was above to show multiple records):

<my_xml>
  <data_set name="Data Set 1">
    <value>1</value>
    <value>2</value>
    <value>3</value>
    <value>4</value>
    <value>5</value>
    <value>6</value>
    <value>7</value>
  </data_set>
  <data_set name="Data Set 2">
    <value>8</value>
    <value>9</value>
    <value>10</value>
  </data_set>
</my_xml>

Here's my XSLT snippet:

<xsl:template match="/">
  <fo:table-body>
    <xsl:for-each select="/my_xml/data_set">
      <xsl:variable name="Data" select="current()"/>
      <xsl:variable name="Cols">5</xsl:variable>
      <xsl:variable name="Rows" select="ceiling(count($Data/value) div $Cols)"/>

      <xsl:call-template name="AddRows">
        <xsl:with-param name="Data" select="$Data"/>
        <xsl:with-param name="Cols" select="$Cols"/>
        <xsl:with-param name="Rows" select="$Rows"/>
        <xsl:with-param name="CurrRow">1</xsl:with-param>
        <xsl:with-param name="CurrCell">1</xsl:with-param>
      </xsl:call-template>
    </xsl:for-each>
  </fo:table-body>
</xsl:template>

<xsl:template name="AddRows">
  <xsl:param name="Data"/>
  <xsl:param name="Cols"/>
  <xsl:param name="Rows"/>
  <xsl:param name="CurrRow"/>
  <xsl:param name="CurrCell"/>

  <xsl:if test="$CurrRow &lt;= $Rows">
    <fo:table-row>
      <xsl:if test="$CurrRow=1">
        <xsl:element name="fo:table-cell">
          <xsl:if test="$Rows &gt; 1">
            <xsl:attribute name="number-rows-spanned"><xsl:value-of
select="$Rows"/></xsl:attribute>
          </xsl:if>
          <fo:block>
            <xsl:value-of select="$Data/@name"/>
          </fo:block>
        </xsl:element>
      </xsl:if>

      <xsl:call-template name="AddCells">
        <xsl:with-param name="Data" select="$Data"/>
        <xsl:with-param name="Cols" select="$Cols"/>
        <xsl:with-param name="CurrRow" select="$CurrRow"/>
        <xsl:with-param name="CurrCell" select="$CurrCell"/>
      </xsl:call-template>
    </fo:table-row>

    <xsl:call-template name="AddRows">
      <xsl:with-param name="Data" select="$Data"/>
      <xsl:with-param name="Cols" select="$Cols"/>
      <xsl:with-param name="Rows" select="$Rows"/>
      <xsl:with-param name="CurrRow" select="$CurrRow+1"/>
      <xsl:with-param name="CurrCell" select="$CurrCell + $Cols"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

<xsl:template name="AddCells">
  <xsl:param name="Data"/>
  <xsl:param name="Cols"/>
  <xsl:param name="CurrRow"/>
  <xsl:param name="CurrCell"/>

  <xsl:if test="$CurrCell &lt;= ($CurrRow * $Cols)">
    <fo:table-cell>
      <fo:block>
        <xsl:choose>
          <xsl:when test="count($Data/value[position()=$CurrCell])=1">
            <xsl:value-of select="$Data/value[position()=$CurrCell]"/>
          </xsl:when>
          <xsl:otherwise>(spacer cell)</xsl:otherwise>
        </xsl:choose>
      </fo:block>
    </fo:table-cell>

    <xsl:call-template name="AddCells">
      <xsl:with-param name="Data" select="$Data"/>
      <xsl:with-param name="Cols" select="$Cols"/>
      <xsl:with-param name="CurrRow" select="$CurrRow"/>
      <xsl:with-param name="CurrCell" select="$CurrCell + 1"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to