Re: [xsl] Optimizing XSLT iteration

Subject: Re: [xsl] Optimizing XSLT iteration
From: "Sujata Gohad" <sgohad@xxxxxxx>
Date: Sun, 7 Oct 2007 15:15:05 -0700
Hi Deborah,

Thanks for your response. I had tried the approach your suggested as
well, but no improvement in performance. :(

I am using Saxon8, that seems to be smartly execute the position()=1
iteration only once. (I verified this using Stylus Studio debugger).


Are there any other suggestions? Any possibility of introducing
parallelism, etc? :-)


Many thanks,
- Sujata

On 10/7/07, Deborah Pickett <debbiep-list-xsl@xxxxxxxxxx> wrote:
> Sujata Gohad wrote:
> >                             <xsl:for-each select="locus[position()=1]">
> >                                 <xsl:text >M </xsl:text >
> >                                 <xsl:value-of select="@ellipse_x"/ >
> >                                 <xsl:text > </xsl:text >
> >                                 <xsl:value-of select="@ellipse_y"/ >
> >                             </xsl:for-each >
> >                             <xsl:for-each select="locus[position()!=1]">
> >                                 <xsl:text > L</xsl:text >
> >                                 <xsl:value-of select="@ellipse_x"/ >
> >                                 <xsl:text > </xsl:text >
> >                                 <xsl:value-of select="@ellipse_y"/ >
> >                             </xsl:for-each >
>
> > Is there a way to faster iteration of the "locus" elements?
>
> See if this is any quicker:
>
> <xsl:for-each select="locus">
>   <xsl:choose>
>     <xsl:when test="position() = 1">
>       <xsl:text>M </xsl:text>
>     </xsl:when>
>     <xsl:otherwise>
>       <xsl:text> L </xsl:text>
>     </xsl:otherwise>
>   </xsl:choose>
>   <xsl:value-of select="@ellipse_x"/ >
>   <xsl:text > </xsl:text >
>   <xsl:value-of select="@ellipse_y"/ >
> </xsl:for-each>
>
> Depending on your XSLT processor, your original code may be constructing
> up to four node-sets: locus, the subset when position() = 1, locus
> (again), the subset when position() != 1.
>
> You're allowed to use position() in almost any expression, not just as
> the predicate of a prior selection.  In my code, position() applies to
> the position that each locus has in the most recent for-each, which is
> what you want.

Current Thread