<xslTutorial creator="nicmila@idoox.com">
<index keywords='position() last() xsl:call-template xsl:sort'/>
<description>
The position function returns a number equal to the context position and the last function returns a number equal to the context size from the expression evaluation context.<stylesheet id='id2'/> demonstrates use of these functions in several contexts. <stylesheet id='id3'/> compares sorted and unsorted xsl:for-each element.</description>
<xmlSource id="id1">
<AAA>
<BBB>
<CCC>Carl</CCC>
</BBB>
<BBB/>
<BBB/>
</AAA>
<AAA>
<BBB/>
<BBB>
<CCC>John</CCC>
<CCC>Charles</CCC>
<CCC>Robert</CCC>
<CCC>Anthony</CCC>
</BBB>
</AAA>
</xmlSource>
<attValues>
<value match=''></value>
</attValues>
<xslStylesheet id="id2">
<xsl:template match="/">
<DIV>
<xsl:for-each select="//BBB">
<xsl:call-template name="printout"/>
</xsl:for-each>
</DIV>
<DIV>
<xsl:apply-templates select="//CCC"/>
</DIV>
<DIV>
<xsl:apply-templates select="//AAA[last()]//CCC"/>
</DIV>
</xsl:template>
<xsl:template match="CCC">
<xsl:call-template name="printout"/>
</xsl:template>
<xsl:template name="printout">
<xsl:if test="position()=1">
<xsl:value-of select="name()"/>
</xsl:if>
<xsl:text>(</xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="last()"/>
<xsl:text>)</xsl:text>
</xsl:template>
</xslStylesheet>
<xslStylesheet id="id3">
<xsl:template match="/">
<TABLE border='1'>
<TR><TH>Position</TH><TH>Last</TH><TH>Name</TH></TR>
<xsl:for-each select="//AAA[last()]//CCC">
<TR>
<TD><xsl:value-of select="position()"/></TD>
<TD><xsl:value-of select="last()"/></TD>
<TD><xsl:value-of select="text()"/></TD>
</TR>
</xsl:for-each>
</TABLE>
<TABLE border='1'>
<TR><TH>Position</TH><TH>Last</TH><TH>Name</TH></TR>
<xsl:for-each select="//AAA[last()]//CCC">
<xsl:sort order="ascending" select="text()"/>
<TR>
<TD><xsl:value-of select="position()"/></TD>
<TD><xsl:value-of select="last()"/></TD>
<TD><xsl:value-of select="text()"/></TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xslStylesheet>
</xslTutorial>