You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用for-each-group求和变量时出现字符串拼接问题求助

问题:XSLT 2.0中sum()返回字符串拼接而非数值总和

我有一组节点,需要先计算每行总价再对这些总价分组求和。已创建对应变量,但使用sum()输出最终结果时,得到的是拼接字符串而非数值总和。我使用XSLT 2.0,需根据每个节点内的UnitPriceBasis代码计算不同价格基准,最终要输出所有计算值的总和作为新增节点TOTALLINEPRICE的值。

输入XML示例:

<LineItems>...</LineItems>

当前使用的XSLT代码片段:

<tpi:Fact name="TotalLinePrice" factType="Virtual">...</tpi:Fact>

当前错误输出:

"TOTALLINEPRICE":"105.28216466.0819.684.5618405.24395.22.1519.35"

该结果是每行计算结果<xsl:sequence select="format-number($calcPriceBasis * $orderQty, '0.00')"/>的拼接字符串。

期望输出:

"TOTALLINEPRICE": "1456.84"

解决方案

问题核心是你先对每行计算结果做了字符串格式化,再执行求和操作——sum()函数处理字符串列表时,会默认执行字符串拼接而非数值相加。

正确的处理逻辑应该是:

  1. 先对每行的$calcPriceBasis * $orderQty进行数值层面的求和,保留数值类型
  2. 求和完成后,再对最终的总和使用format-number()做格式化输出

以下是具体代码示例:

<tpi:Fact name="TotalLinePrice" factType="Virtual">
  <!-- 先计算所有行的数值总和,再格式化结果 -->
  <xsl:sequence select="format-number(
    sum(
      LineItems/LineItem/(
        <!-- 根据UnitPriceBasis计算对应价格基准,保持数值类型 -->
        if (UnitPriceBasis = 'A') then (UnitPrice * 1.1)
        else if (UnitPriceBasis = 'B') then (UnitPrice * 0.9)
        else UnitPrice
      ) * orderQty
    ),
    '0.00'
  )"/>
</tpi:Fact>

关键注意点:

  • 确保求和对象是数值类型,而非经过format-number()处理后的字符串
  • 将format-number()放在sum()的外层,仅对最终总和做格式化,不要对每行结果单独格式化

内容的提问来源于stack exchange,提问作者user2081925

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:05:22