RE: [xsl] Key and/or grouping questions.

Subject: RE: [xsl] Key and/or grouping questions.
From: "Michael Kay" <michael.h.kay@xxxxxxxxxxxx>
Date: Thu, 5 Dec 2002 10:51:41 -0000
> I have a set of style sheets which have a sever performance 
> problem. Distilled (hopefully not diluted past usefulness), I 
> am processing a
> large set of sibling elements a few elements at a time.   I 
> believe the
> problem is with the following statement (which I've 
> changed/condensed the expression of):
> 
> <xsl:for-each  select="/elements[ (position() &gt;= $Start) and
> (position() &lt;= $End) ]">
> ...
> </xsl:for-each>

I suspect it actually starts "//elements", because you can't have more
than one element that's a child of the root node. But the fact that
position() works suggests that they are siblings. Without seeing your
source, the first step might be to change this to /*/elements[...]. The
next step would be to create a global variable whose value is
/*/elements, and replace the for-each by

select="$var[position() ...]


> 
> I was referred to a FAQ on grouping and this led me to 
> attempt to setup
> some kind of solution utilizing keys.   Unfortunately, the 
> XSL reference
> I have has no information on <xsl:key> and my favorite FAQ 
> has a list of topics under keys with no corresponding 
> content.  Anyway, my XSL processor (Xalan) doesn't like my 
> key definition.  Is the "use" parameter limited from being a 
> numerical expressions?
> 
> <xsl:key name="PageKey" match="/gnsl:Results/gnsl:Table/gnsl:Row"
>          use="((position() - 1) / $RowsPerPage) + 1)" />
> 

It helps in any XPath expression to balance the parentheses properly.

But your problem here is misunderstanding what "position()" means. It
means the position of the context node in the sequence of nodes
currently being processed. In <xsl:key> it will always be 1.

What you want is something like:

   use="count(preceding-sibling::*)"

But I suspect this may not help you, because it's likely to be very
expensive to build this index.

I think a better approach would be to restructure your code to use the
usual:

<xsl:for-each select="xx[position() mod $size = 1]">
  ..
  <xsl:for-each select=".|following-sibling[position() &lt;= $size]">

Michael Kay
Software AG
home: Michael.H.Kay@xxxxxxxxxxxx
work: Michael.Kay@xxxxxxxxxxxxxx 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread