web-dev-qa-db-fra.com

XSL for-each: comment détecter le dernier nœud?

J'ai ce code simple:

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

J'essaie d'ajouter une virgule pour chaque élément ajouté.

Cela a 2 défauts:

  1. Cas où il n'y a qu'un seul élément: le code ajouterait inconditionnellement une virgule.
  2. Cas où il y a plus d'un élément: le dernier élément aurait une virgule.

Selon vous, quelle est la solution la plus élégante pour résoudre ce problème?

J'utilise XSLT 2.0

47
sivabudh

Si vous utilisez XSLT 2.0, la réponse canonique à votre problème est

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

Sur XSLT 1.0, l'approche un peu coûteuse en CPU pour trouver le dernier élément d'un ensemble de nœuds est

<xsl:if test="position() = last()" />
80
Stobor

Réponse finale:

<xsl:for-each select="GroupsServed">
  <xsl:value-of select="."/>                                    
  <xsl:choose>
    <xsl:when test="position() != last()">,<br/></xsl:when>
  </xsl:choose>
</xsl:for-each>
28
sivabudh
<xsl:variable name="GROUPS_SERVED_COUNT" select="count(GroupsServed)"/>
<xsl:for-each select="GroupsServed">
    <xsl:value-of select="."/>
    <xsl:if test="position() < $GROUPS_SERVED_COUNT">
        ,<br/>
    </xsl:if>
</xsl:for-each></font>
2
Grigory K