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

Subject: RE: [xsl] working out where the last() is
From: "Robert Walpole" <robert.walpole@xxxxxxxxxxxx>
Date: Fri, 6 Oct 2006 12:19:08 +0100
Thanks to you all. That works perfectly. I had wondered about making a
single node list of the attribs I wanted, just couldn't see how select
it. I am using XSLT 2.0 so the seperator is ideal.

Thanks again.
Rob
(robert.walpole@xxxxxxxxxxxx)

> -----Original Message-----
> From: Michael Kay [mailto:mike@xxxxxxxxxxxx]
> Sent: 06 October 2006 11:41
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] working out where the last() is
>
>
> 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