> -----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]