Re: [xsl] position() ne last()

Subject: Re: [xsl] position() ne last()
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Thu, 3 Dec 2009 05:39:42 -0800
That's remarkable. Somehow it is similar to the prepend optimization I
wrote about in my blog last December:

  http://dnovatchev.spaces.live.com/Blog/cns!44B0A32C2CCF7488!981.entry

Does a catalog of such optimizations exist?


--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play


On Thu, Dec 3, 2009 at 4:43 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
>
> A little coding tip. I've no idea why this hasn't come up before. It's very
> common to write things like
>
> <xsl:for-each select="para">
> B <xsl:apply-templates/>
> B <xsl:if test="position() ne last()">
> B  B  <br/>
> B </xsl:if>
> </xsl:for-each>
>
> But a much better way of coding this is:
>
> <xsl:for-each select="para">
> B <xsl:if test="position() ne 1">
> B  B  <br/>
> B </xsl:if>
> B <xsl:apply-templates/>
> </xsl:for-each>
>
> Why? Because however hard the optimizer works, the last() function is hard
> work: it involves some kind of lookahead. With "position() ne last()" the
> lookahead might be limited to one element, but it's still a lot more
> complicated than testing whether the position is 1.
>
> With streaming coming along, the latter formulation is also more likely to
> be streamable (because lookahead is impossible with streaming).
>
> I might think about doing the above rewrite automatically...
>
>
> Regards,
>
> Michael Kay
> http://www.saxonica.com/
> http://twitter.com/michaelhkay

Current Thread