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 |
- Re: Slow XSLT
- Manfred Staudinger - 1 Mar 2008 23:31:44 -0000 <=
- <Possible follow-ups>
- Michael Kay - 1 Mar 2008 23:34:35 -0000
|
|