Thursday, February 10, 2011

XSL for-each: how to detect last node?

I have this simple code:

<xsl:for-each select="GroupsServed">
  <xsl:value-of select="."/>,<br/>
</xsl:for-each></font>

I'm trying to add a comma for each item added.

This has 2 flaws:

  1. Case of when there's only 1 item: the code would unconditionally add a comma.
  2. Case of when there's more than 1 item: the last item would have a comma to it.

What do you think is the most elegant solution to solve this?

I'm using XSLT 2.0

  • If you're using XSLT 2.0, the canonical answer to your problem is

    <xsl:value-of select="GroupsServed" separator=", " />
    

    On XSLT 1.0, the somewhat CPU-expensive approach to finding the last element in a node-set is

    <xsl:if test="position() = last()" />
    
    ShaChris23 : thanks for the XSLT 1.0 approach. It worked fine on my 2.0
    Stobor : I shouldn't try to answer these questions via a phone. I've added the detail on the XSLT2.0 method, in case it wasn't clear earlier.
    From Stobor
  • Final answer:

    <xsl:for-each select="GroupsServed">
      <xsl:value-of select="."/>            
      <xsl:choose>
        <xsl:when test="position() != last()">,<br/></xsl:when>
      </xsl:choose>
    </xsl:for-each>
    
    From ShaChris23

0 comments:

Post a Comment