[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Slow XSLT


Subject: Re: [xsl] Slow XSLT
From: "Manfred Staudinger" <manfred.staudinger@xxxxxxxxx>
Date: Sun, 2 Mar 2008 00:31:21 +0100

On 01/03/2008, Cleyton Jordan <cleytonjordan@xxxxxxxxxxx> wrote:
>  However, I thought that by using // followed by a
>  predicate ( //ColGrp[count(ancestor::ColGrp)=$depth]
>  ), I would go straight to only those inner most ColGrp
>  elements parent of the Col elements.
No, the XPath processor first has to find a ColGrp element by looking
into every corner of the input doc, and then check for the condition.

>  There is one problem with your approach though. You
>  are assuming that there will always be only two ColGrp
>  like this:
>
>  <xsl:for-each
>  select="/Reports/Report/Columns/ColGrp/ColGrp[count(ancestor::ColGrp)=$depth]">

I would propose a slightly different approach:
<xsl:for-each select="/Reports/Report/Columns/ColGrp">
   <xsl:apply templates mode="ColGrp"/>
</xsl:for-each>
passing the parameters needed for your processing and using only two
templates for ColGrp: one for the innermost ColGrp, and one for the
others
<xsl:templates match="ColGrp[Col]" mode="ColGrp">
processing for the innermost ColGrp here
</xsl:for-each>
<xsl:templates match="ColGrp" mode="ColGrp">
processing here (you can always test the depth with count(ancestor::ColGrp))
</xsl:for-each>
plus one for Col:
<xsl:templates match="Col" mode="ColGrp">
processing here
</xsl:for-each>

Another (simpler) approach would be to limit the maximum number of
dimensions for the table so you can use match patterns like
match="ColGrp"
match="ColGrp/ColGrp"
match="ColGrp/ColGrp/ColGrp"
match="ColGrp/ColGrp/ColGrp/ColGrp"
match="ColGrp[Col]"
match="Col"

Hope this helps,

Manfred


Current Thread
Keywords