[xsl] position() ne last()

Subject: [xsl] position() ne last()
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 3 Dec 2009 12:43:14 -0000
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">
  <xsl:apply-templates/>
  <xsl:if test="position() ne last()">
     <br/>
  </xsl:if>
</xsl:for-each>

But a much better way of coding this is:

<xsl:for-each select="para">
  <xsl:if test="position() ne 1">
     <br/>
  </xsl:if>
  <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