Subject: RE: 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=", "/>
In 1.0:
<xsl:for-each select="$a//*[not(*)]/@name">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">, </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: 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()">, </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)
|