Re: [xsl] Column widths

Subject: Re: [xsl] Column widths
From: Joerg Heinicke <joerg.heinicke@xxxxxx>
Date: Sun, 23 Jun 2002 11:40:49 +0200
Hello Gustaf,

here is a solution that works for me:

<xsl:template match="tr">
    <xsl:apply-templates select="td|th"/>
</xsl:template>

<xsl:template match="td|th">
  <xsl:variable name="x" select="position()"/>
  <fo:table-cell>
    <xsl:copy-of select="(ancestor::table/colgroup/col)[$x]/@width"/>
    <fo:block>
      <xsl:apply-templates/>
    </fo:block>
  </fo:table-cell>
</xsl:template>

The correct applying the template on td and th is important for a correct position(). The next step is the "grouping" of the col-elements. Because they have different colgroup-parents, you must use parentheses for this job. This should work.

Two more comments: Why are you using the attribute-axis, writing @ is much shorter ... and in my eyes more readable. And have a look at <xsl:copy-of/> above. It does the same job like your <xsl:if/> + <xsl:attribute/> + <xsl:value-of/>. If a attribute should have the same name and value in input and output, it will be easier to copy it.

Output:

<fo:table-cell width="30%" xmlns:fo="test">
  <fo:block>A header</fo:block>
</fo:table-cell>
<fo:table-cell width="60%" xmlns:fo="test">
  <fo:block>Some content here.</fo:block>
</fo:table-cell>
<fo:table-cell width="10%" xmlns:fo="test">
  <fo:block>Some more here.</fo:block>
</fo:table-cell>

Regards,

Joerg

Gustaf Liljegren wrote:
Mike Brown wrote:


Brackets indicate predicates. Think of them as filters, providing everything
to the left of them, for which everything inside them is true.


Got it.

Okay, here's a sample table:

<table>
  <colgroup>
    <col width="30%"/>
  </colgroup>
  <colgroup>
    <col width="60%"/>
    <col width="10%"/>
  </colgroup>
  <tbody>
    <tr>
      <th>A header</th>
      <td>Some content here.</td>
      <td>Some more here.</td>
    </tr>
  </tbody>
</table>

For now, I assume there will always be equal amounts of table cells in a
row as there are <col> elements. The result will look like this:

<fo:table>
  <fo:table-body>
    <fo:table-row>
      <fo:table-cell width="30%">...</fo:table-cell>
      <fo:table-cell width="60%">...</fo:table-cell>
      <fo:table-cell width="10%">...</fo:table-cell>
    </fo:table-row>
  </fo:table-body>
</fo:table>

Here's how the <td> template looks like. The problem is in the long XPath
expressions:

<xsl:template match="td">
<xsl:variable name="x" select="position()"/>
<fo:table-cell xsl:use-attribute-sets="table-padding">
...
<xsl:if test="ancestor::table//col[$x]/attribute::width">
<xsl:attribute name="width">
<xsl:value-of select="ancestor::table//col[$x]/attribute::width"/>
</xsl:attribute>
</xsl:if>
<fo:block>
<xsl:apply-templates/>
</fo:block>
</fo:table-cell>
</xsl:template>
Gustaf


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


Current Thread