RE: [xsl] working out where the last() is

Subject: RE: [xsl] working out where the last() is
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 6 Oct 2006 11:41:17 +0100
In XSLT 2.0 (with $a as the <areaserved> element):

<xsl:value-of select="$a//*[not(*)]/@name" separator=",&#160;"/>

In 1.0:

<xsl:for-each select="$a//*[not(*)]/@name">
  <xsl:value-of select="."/>
  <xsl:if test="position() != last()">,&#160;</xsl:if>
</xsl:for-each>

last() gives you the number of items in the current node list, which in this
case is the nodes selected by 
$a//*[not(*)]/@name.

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: Robert Walpole [mailto:robert.walpole@xxxxxxxxxxxx] 
> Sent: 06 October 2006 11:14
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] working out where the last() is
> 
> Hi,
> 
> I have some XML data which contains an areaserved node as follows:
> 
> <areaserved>
> 	<district name="South Hams">
> 		<town name="Dartmouth">
> 			<settlement name="Kingswear"/>
> 		</town>
> 		<town name="Totnes"/>
> 	</district>
> 	<district name="Torbay"/>
> </areaserved>
> 
> I am trying to write some XSLT to transform this to a list as follows:
> 
> Kingswear, Totnes, Torbay
> 
> In other words I want to output the name attribute of 
> elements that have no children and I want these names to be 
> seperated by a comma. I can output the attributes ok but my 
> problem is trying to prevent the code putting out a comma at 
> the end of the list, given that I don't know whether the end 
> of the list will be a settlement, town or district. I have 
> tried using last() like this:
> 
> <xsl:if test="position() != last()">,&#160;</xsl:if>
> 
> but this only works on the context node, so in this case 
> Kingswear, Totnes and Torbay are all the last and none of 
> them get a comma! 
> 
> Any ideas anyone?
> 
> Many Thanks
> Rob Walpole
> (robert.walpole@xxxxxxxxxxxx)

Current Thread