xsl-list
[Top] [All Lists]

Re: Performance degraded with grouping and sorting.

2004-10-30 02:50:19
Bhupendra, (and others,)

Why are you using a double for-each loop?

I would expect you use it to output a separator of any kind (title, hr, or 
anything else) between
the groups, but you aren't as far as I can see. In that case, I would expect it 
would be sufficient
to add a sort key on ACCT_NBR to group to that element. Note that the order of 
the sort keys
influences the result.

Also, I see you use things like *[name()=$paramSortKey], though only in the 
outer loop. Still, it
could improve performance to duplicate the sorting code and wrap things up in a 
choose, so that you
can replace the expression by just the element name.

Personally, I still prefer a multistep sorting and grouping algorithm. If you 
can assertain that
values are sorted already, grouping might become a lot easier in XSLT 1. I used 
Cocoon to build a
multistep process, where I first sort and later group. The grouping algoritms 
uses an index for
retrieving the first of a group, but not with the Munchian Method:

  <xsl:key name="first-group-values" match="item[not(preceding-sibling::*) or 
(@group !=
preceding-sibling::*[1]/@group)]" use="'all'" />
  <xsl:key name="values-by-group" match="item" use="@group" />

  <xsl:for-each select="key('first-group-values', 'all')">
    <!-- output separator -->
    <xsl:for-each select="key('values-by-group', @group)">
      <!-- output item -->
    </xsl:for-each>
  </xsl:for-each>

Note that I use a group attribute I determined in an earlier step to base the 
grouping on. This way,
the grouping algorithm doesn't change when I want to group on something else. 
(Separation of Concerns!)

Anyone who would like to do some performance tests on this?

Grtz,
Geert