使用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()函数处理字符串列表时,会默认执行字符串拼接而非数值相加。
正确的处理逻辑应该是:
- 先对每行的
$calcPriceBasis * $orderQty进行数值层面的求和,保留数值类型 - 求和完成后,再对最终的总和使用
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
相关产品推荐
相关产品推荐

