> -----Original Message-----
> From: James Earl [mailto:[EMAIL PROTECTED]
>
Hi,
<snip />
> I'm just curious to know what people have found works best for them as
> an alternative to achieving somewhat auto table layout? I'm currently
> trying to figure out what I should do. I've just started learning XSL
> as a result of beginning to use FOP to try to automatically create a
> catalogue from data stored within a MySQL database.
>
> The only idea I've had so far, was to use the maximum column lengths as
> returned from PHP's mysql_fetch_field() to somehow formulate a
> proportional-column-width() value for the column-widths.
>
> As for the formula... I have no clue what that might be yet! :)
>
Hmm. proportional-column-width() could indeed do the trick here. Too bad
XSLT doesn't have aggregate functions min() or max(), but this can be worked
around rather easily.
Say your source XML looks like (--and you are actually using XML+XSLT to
generate FO...)
<root>
<record>
<field index="1">Some piece of text</field>
<field index="2">A slightly longer portion of text</field>
</record>
<record>
<field index="1">Longer text in first field</field>
<field index="2">Shorter text in field two</field>
</record>
</root>
Then, in XSLT, to construct a table offering the maximum field lengths
mapped to column-widths, you could do something like (pseudo-code --well,
almost... the code actually works):
<xsl:template match="root">
<fo:table table-layout="fixed" width="100%">
<!-- use the first row as basis; we only need the first row
to determine the number of columns (see CSS spec) -->
<xsl:apply-templates select="record[1]/field" mode="col-create" />
<fo:table-body>
<xsl:apply-templates select="record" mode="row-create" />
</fo:table-body>
</fo:table>
</xsl:template>
<xsl:template match="field" mode="col-create">
<!-- create a variable to contain the maximum field-width ... -->
<xsl:variable name="vMax">
<!-- iterate over all fields with the same @index ... -->
<xsl:for-each select="/*/record/[EMAIL PROTECTED]()/@index]">
<!-- sort in descending order -->
<xsl:sort select="string-length()" order="descending" />
<!-- the first one in sorted order is the one we need -->
<xsl:if test="position()=1">
<xsl:value-of select="string-length()" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<!-- ... and use this maximum for prop-col-width -->
<fo:table-column column-number="[EMAIL PROTECTED]"
column-width="{concat('proportional-column-width(',
$vMax,')')}" />
</xsl:template>
<xsl:template match="record" mode="row-create">
<fo:table-row>
<xsl:for-each select="field">
<fo:table-cell column-number="[EMAIL PROTECTED]">
<fo:block>
<xsl:value-of select="." />
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
Hope this gives you a clue...
Greetz,
Andreas
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]