This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Column widths


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]