如何使用xsl:for-each渲染逗号分隔的列表

6

我正在使用XSLT将股票列表呈现为HTML,并希望该列表以逗号分隔。假设我要使用xsl:for-each...

<xsl:for-each select="/Tickers/Ticker">
    <xsl:value-of select="TickerSymbol"/>,
</xsl:for-each>

什么是去掉尾随逗号的最佳方法?是否有比xsl:for-each更好的方法?
4个回答

18
<xsl:for-each select="/Tickers/Ticker">
    <xsl:if test="position() > 1">, </xsl:if>
    <xsl:value-of select="TickerSymbol"/>
</xsl:for-each>

不知道您是否打算编码大于符号,但是在使用.Net时,正确的语法是:<xsl:if test="position() > 1">, </xsl:if> - MadMax1138

7
XSLT 2.0 中,您可以使用 string-join 函数 来实现此操作(无需 for-each)。
<xsl:value-of  select="string-join(/Tickers/Ticker, ',')"/>  

谢谢,我目前正在使用 .Net 2.0,据我所知,xslt 2.0 不是一个选择。 - MadMax1138

2
在XSLT 1.0中,使用xsl:apply-templates是使用xsl:for-each的另一种选择。
<xsl:template match="/">

   <!-- Output first element without a preceding comma -->
   <xsl:apply-templates select="/Tickers/Ticker[position()=1]" />

   <!-- Output subsequent elements with a preceding comma -->
   <xsl:apply-templates select="/Tickers/Ticker[position()&gt;1]">
      <xsl:with-param name="separator">,</xsl:with-param>
   </xsl:apply-templates>

</xsl:template>

<xsl:template match="Ticker">
   <xsl:param name="separator" />
   <xsl:value-of select="$separator" /><xsl:value-of select="TickerSymbol" />
</xsl:template>

2

我知道你说XSL 2.0不是一个选项,而且问题已经存在很长时间了,但是对于所有正在寻找实现你想要达到目标的人:

XSL 2.0或更高版本有更简单的方法。

<xsl:value-of separator=", " select="/Tickers/Ticker/TickerSymbol" />

这将读取你的 /Tickers/Ticker 元素,并在需要的地方插入“,”作为分隔符。
如果有更简单的方法,请提供建议。
谢谢,Kevin。

这正是我正在寻找的,尽管它在技术上并不是对问题的答案。 - Matt

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