如何获取字符串中的数字总和?

时间:2011-07-21 20:58:22

标签: xslt xpath sum

所以我有一个XML文件,并使用XSLT来构建HTML页面。 XML中的标题标记包括后跟::后跟数字的文本。我设法提取数字,但我不知道如何总结数字。

<xsl:value-of select="number(substring-after(/searchresult/document[@id = current()/@refid]/title, ' ::'))/>        

如果我这样做

 <xsl:value-of select=" sum(number(substring-after(/searchresult/document[@id = current()/@refid]/title, ' ::')))>

它向我显示以下错误:

  

错误:该值不是节点集

我甚至尝试制作变量并将值存储在其中并尝试将其总结为:

<xsl:variable name="total">     
    <xsl:value-of select="number(substring-after(/searchresult/document[@id = current()/@refid]/title, ' ::'))"/>   
</xsl:variable>     
<xsl:value-of select="($total)"/>
<xsl:copy-of select="sum($total)"/> 

但它然后向我显示了这个错误:

  

错误:无法将结果树片段作为XSLT下的节点集处理   1.0

如何获得从标题中解析的数字总和?请帮帮我......我迷路了。我非常感谢你的帮助。 谢谢。

2 个答案:

答案 0 :(得分:0)

我通常喜欢使用XML片段来做这样的事情。

<xsl:variable name="Counter">
    <xsl:for-each select="TITLETAG">
        <Number>
            <xsl:value-of select="substring-after(/title, ' ::')"/> 
        </Number>
    </xsl:for-each>
</xsl:variable>
<xsl:value-of select="sum(number($Counter/*:Number/text()))" />

这应该给你解决方案或者至少是一个先机,假设当然有超过1个标题元素。请记住将TITLETAG更改为标题元素。

答案 1 :(得分:0)

您的描述令人困惑,因为它表明只有一个标题,因此只有一个数字。假设数字位于使用// title选择的节点中。

在XSLT 2.0中,它很简单:

sum(for $x in //title return number(substring-after($x, '::')))

在XSLT 1.0中,有三种方法可以对计算出的一组数字求和,而不是直接出现在源代码中。没有一个可以说是容易的。

(a)使用两相变换。构造一个临时树,其节点包含数字,使用xx:node-set()扩展名将其转换为节点集,然后将sum()函数应用于节点集。

(b)使用递归:编写一个递归命名模板,该模板重复调用自身来处理每个节点并累积总数,直到没有剩余的节点来处理

(c)使用Dimitre Novatchev的FXSL库提供的高阶函数。