I support a web site which generates content XML that is then translated into web pages using XSLT. I have been asked to create a new stylesheet which will transform the ou
position()/last() returns position/last position within the current context, so when the navigator is positioned in one <month>, position() will return <day> within that month, and last() will return last <day> within that month, but i guess you know that.
Therefore, what you could do is flatten all <day>'s in an array and put in a variable, prior to selecting just like you did before.
<xsl:variable name="days" select="//day"/>
<xsl:apply-templates select="$days[position()>last()-30]" />
Browsing through the XSLT spec today, I found a note which explains why // behaves this way:
//is short for/descendant-or-self::node()/. For example,//parais short for/descendant-or-self::node()/child::paraand so will select anyparaelement in the document (even aparaelement that is a document element will be selected by//parasince the document element node is a child of the root node);div//parais short fordiv/descendant-or-self::node()/child::paraand so will select allparadescendants of div children.NOTE: The location path
//para[1]does not mean the same as the location path/descendant::para[1]. The latter selects the first descendantparaelement; the former selects all descendantparaelements that are the firstparachildren of their parents.
In other words, when using //, the position() is calculated along the child axis, not the descendant-or-self axis. Specifying descendant or descendant-or-self allows you to get the first/last n nodes as you'd expect:
<xsl:apply-templates select="descendant::day[position()>last()-30]"/>