如何在XSLT中添加所有逗号分隔值

时间:2015-02-10 11:03:47

标签: xslt

我在XSLT中有一个问题。

我有一个变量,假设:

<xsl:variable name="myVar" select="string('1.3,2.1,3.3,5.1,11.4')">

我想添加所有逗号分隔值。

这是我当前的代码,我试图总结存储在$ sum变量中的所有csv值。

<xsl:template name="getCount" >
    <xsl:param name="str" />   <!-- $str is having '0.001,0.003' value -->
    <xsl:param name="delimiter" />
    <xsl:param name="summation" />
     <xsl:choose>
        <xsl:when test="contains(string($str),string($delimiter))">
            <xsl:variable name="beforecomma" select="substring-before(string($str),string($delimiter))" />
            <xsl:variable name="aftercomma" select="substring-after(string($str),string($delimiter))" />
            <xsl:choose>
                <xsl:when test="$aftercomma=''">
                    <xsl:value-of select="$summation + $beforecomma" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:call-template name="getindexvalue">
                        <xsl:with-param name="str" select="$aftercomma" />
                        <xsl:with-param name="delimiter" select="string($delimiter)" />
                        <xsl:with-param name="summation" select="$summation + beforecomma" />
                    </xsl:call-template>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
     </xsl:choose>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

假设call-template是拼写错误,应该是对同一模板的递归调用

<xsl:call-template name="getCount">

那么你实际上非常接近一个有效的解决方案。

中的错误
<xsl:with-param name="summation" select="$summation + beforecomma" />

您在$前面错过了beforecomma

<xsl:with-param name="summation" select="$summation + $beforecomma" />

如果没有美元,您需要查找名为beforecomma的子元素,而不是获取变量的值。


其他一些评论:

  • 你有很多多余的string()电话,你可以简单地说,例如contains($str,$delimiter)代替contains(string($str),string($delimiter)),因为您正在使用的功能会自动将其参数强制转换为字符串。
  • 您当前的代码至少需要两个以逗号分隔的值,它无法应对只给出一个值(其总和就是值本身)。构建模板以应对这种情况实际上会使其变得更简单:
<xsl:template name="getCount" >
    <xsl:param name="str" />   <!-- $str is having '0.001,0.003' value -->
    <xsl:param name="delimiter" />
    <xsl:param name="summation" select="0" />
     <xsl:choose>
        <xsl:when test="contains($str,$delimiter)">
            <xsl:variable name="beforecomma" select="substring-before($str,$delimiter)" />
            <xsl:variable name="aftercomma" select="substring-after($str,$delimiter)" />
            <xsl:call-template name="getCount">
                <xsl:with-param name="str" select="$aftercomma" />
                <xsl:with-param name="delimiter" select="$delimiter" />
                <xsl:with-param name="summation" select="$summation + $beforecomma" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$summation + $str" />
        </xsl:otherwise>
     </xsl:choose>
</xsl:template>