XSL for-each:如何检测最后一个节点?

59

我有这段简单的代码:

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

我正在尝试为每个添加的项目添加逗号。

这有两个缺陷:

  1. 当只有一个项目时:代码将无条件添加逗号。
  2. 当有多个项目时:最后一个项目会有一个逗号。

你认为解决这个问题最优雅的方法是什么?

我正在使用XSLT 2.0

我正在尝试为每个添加的项目添加逗号。

这有两个缺陷:

  1. 当只有一个项目时:代码将无条件添加逗号。
  2. 当有多个项目时:最后一个项目会有一个逗号。

你认为解决这个问题最优雅的方法是什么?

我正在使用XSLT 2.0


2
这个问题可能会有用 https://dev59.com/t3RA5IYBdhLWcg3w2x6W - Dan Midwood
没错,但实际上我还想为每个项目包括一个新行。 - sivabudh
4个回答

92

如果你正在使用XSLT 2.0,那么你的问题的规范答案是:

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

在XSLT 1.0中,找到节点集中最后一个元素的一种相对耗费CPU性能的方法是

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

我不应该试图通过手机回答这些问题。如果之前不够清楚,我已经添加了有关XSLT2.0方法的详细信息。 - Stobor
2
无法让这个语法正常工作,如果你碰巧能帮忙解决这个问题... https://stackoverflow.com/questions/62005912/xslt3-joining-values-with-separator - ILoveCoding

31

最终答案:

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

4
<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>

3
在每个新项目之前插入列分隔符,除了第一个项目。然后在for-each循环之外插入换行符。
<xsl:for-each select="GroupsServed">
  <xsl:if test="position() != 1">,</xsl:if>
  <xsl:value-of select="."/>
</xsl:for-each>
<br/>

换句话说,把每个项目都当作最后一个项目来处理。唯一的例外是第一个项目前不需要逗号分隔符。循环在处理完最后一个项目后结束,这也告诉我们在哪里放置断点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接