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

在XSLT中使用foreach添加属性值并计算乘积总和的问题

解决EARNEDINCOME节点乘积总和计算问题

我来帮你搞定这个总和计算的问题!你现在的代码只能算出单个EARNEDINCOME节点的乘积,没法把所有子节点的乘积加总到父节点上对吧?咱们调整下处理逻辑就能实现需求——核心是针对每个EMPLOYMENT节点,计算其下所有EARNEDINCOME的乘积总和,而不是遍历单个子节点。

正确实现思路

  1. 以EMPLOYMENT节点为处理单位,因为总和属性是属于这个父节点的;
  2. 使用sum()函数,对当前EMPLOYMENT下的所有EARNEDINCOME节点,计算@EARNEDINCOMEAMOUNT * @PAYMENTFREQUENCYTYPE的乘积,再把这些乘积全部加总;
  3. 给EMPLOYMENT节点新增GROSSINCOME属性,值就是计算出的总和;
  4. 保留原节点的所有属性和子节点内容,不破坏原有结构。

完整XSLT代码示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 默认模板:复制所有节点和属性,保证原有内容不丢失 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 专门处理EMPLOYMENT节点,添加GROSSINCOME属性 -->
    <xsl:template match="EMPLOYMENT">
        <xsl:copy>
            <!-- 复制原节点的所有属性 -->
            <xsl:apply-templates select="@*"/>
            <!-- 计算并添加总和属性 -->
            <xsl:attribute name="GROSSINCOME">
                <xsl:value-of select="sum(EARNEDINCOME/@EARNEDINCOMEAMOUNT * EARNEDINCOME/@PAYMENTFREQUENCYTYPE)"/>
            </xsl:attribute>
            <!-- 复制原节点的所有子节点 -->
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输入输出示例

输入XML

<EMPLOYMENT CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EMPLOYMENTSTATUS="110" > 
    <EARNEDINCOME CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EARNEDINCOMESEQUENCENUMBER="1" EARNEDINCOMEAMOUNT="1142" PAYMENTFREQUENCYTYPE="12" PAYMENTFREQUENCYTYPE_TEXT="Monthly" /> 
    <EARNEDINCOME CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EARNEDINCOMESEQUENCENUMBER="2" EARNEDINCOMEAMOUNT="4960" PAYMENTFREQUENCYTYPE="12" PAYMENTFREQUENCYTYPE_TEXT="Monthly" /> 
</EMPLOYMENT>

输出XML

<EMPLOYMENT CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EMPLOYMENTSTATUS="110" GROSSINCOME="73224">
    <EARNEDINCOME CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EARNEDINCOMESEQUENCENUMBER="1" EARNEDINCOMEAMOUNT="1142" PAYMENTFREQUENCYTYPE="12" PAYMENTFREQUENCYTYPE_TEXT="Monthly"/>
    <EARNEDINCOME CUSTOMERNUMBER="1001349" CUSTOMERVERSIONNUMBER="31" EMPLOYMENTSEQUENCENUMBER="2" EARNEDINCOMESEQUENCENUMBER="2" EARNEDINCOMEAMOUNT="4960" PAYMENTFREQUENCYTYPE="12" PAYMENTFREQUENCYTYPE_TEXT="Monthly"/>
</EMPLOYMENT>

(计算说明:1142*12 + 4960*12 = 13704 + 59520 = 73224)

原有代码的问题分析

你之前用xsl:for-each遍历每个EARNEDINCOME,每次循环只能处理单个节点的乘积,而且是给子节点加属性(不是给父节点EMPLOYMENT加),自然得不到总和。现在调整为针对父节点计算总和,就能一次性得到所有子节点乘积的加总结果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:54:08