- From: John E. Simpson <simpson@polaris.net>
- Date: Wed, 2 Jan 2002 8:26:30 -0500
- To: Arvind Parthasarathy <arvindp@hotpop.com>, fop-users@apache.org, www-xsl-fo@w3.org
> From: Arvind Parthasarathy <arvindp@hotpop.com>
> Date: 2002/01/02 Wed PM 01:03:09 EST
>
> I am facing some speed issues while generating PDF tables using
> FOP. I need to
> be able to generate the entire PDF document within 6-7 seconds. However,
> I found that a table with 500+ rows with about 6 or 7 columns takes the
> entire PDF doc
> about 20 seconds for generation. Is there some way to write the XSL:FO
> so that
> transformation occurs quickly.
I don't know FOP well enough to know if there's some FOP-specific optimization you can do. But as far as your XSLT code, a couple observations....
(1) There seems to be a stray "</fo:block></xsl:for-each>" set of end tags at the very end of the code you posted. (Presumably just a copy/paste/data entry error, since otherwise the transformation wouldn't even start.)
(2) A pseudo-code version of the XSLT might look something like this:
For each TABLE element in source tree:
[do some stuff]
Build a table in result tree
Set up column sizes
For each SCHEMA/COLUMN descendant of this TABLE element:
[do some stuff]
Under certain conditions:
Jump back to top of source tree to get value of
root element's "type" attribute
Build table header row:
[do some stuff]
For each SCHEMA/COLUMN descendant of this TABLE element:
[do some stuff]
[do some more stuff]
Close the table
A couple things occurred to me about this. First, at the point where you go back up to the type attribute of the root ReportXMLFormat element, you may be churning unnecessarily -- depending on how often the controlling condition is met and, I guess, on whether the XSLT engine in question is cacheing source-tree stuff it's already retrieved. It might be more efficient to set up a variable outside the scope of the outermost xsl:for-each, to retrieve the value of that attribute just once.
The second and I think bigger problem MAY be that you've got two xsl:for-each's for the same source-tree content (the SCHEMA/COLUMN descendants of the source's current TABLE element) within the outermost xsl:for-each. Maybe it's not possible, maybe it is, but I think you might want to try somehow combining those two into one. If it's not possible, this is a long shot but you might also try replacing each of those two inner xsl:for-each loops with an xsl:apply-templates, using the mode attribute something like the following:
<xsl:apply-templates select="SCHEMA/COLUMN" mode="col"/>
....
<xsl:apply-templates select="SCHEMA/COLUMN" mode="cell"/>
<xsl:template match="SCHEMA/COLUMN" mode="col">
[column-related processing]
</xsl:template>
<xsl:template match="SCHEMA/COLUMN" mode="cell">
[cell-related processing]
</xsl:template>
This should only make a difference, I guess, if the XSLT engine processes xsl:apply-templates loops more efficiently than xsl:for-each loops, but it may be worth a try.
===================================
"I almost had a psychic girlfriend but she left me
before we met." (unknown, possibly Steven Wright)
Received on Wednesday, 2 January 2002 08:26:37 UTC