在XSLT中使用foreach添加属性值并计算乘积总和的问题
解决EARNEDINCOME节点乘积总和计算问题
我来帮你搞定这个总和计算的问题!你现在的代码只能算出单个EARNEDINCOME节点的乘积,没法把所有子节点的乘积加总到父节点上对吧?咱们调整下处理逻辑就能实现需求——核心是针对每个EMPLOYMENT节点,计算其下所有EARNEDINCOME的乘积总和,而不是遍历单个子节点。
正确实现思路
- 以
EMPLOYMENT节点为处理单位,因为总和属性是属于这个父节点的; - 使用
sum()函数,对当前EMPLOYMENT下的所有EARNEDINCOME节点,计算@EARNEDINCOMEAMOUNT * @PAYMENTFREQUENCYTYPE的乘积,再把这些乘积全部加总; - 给
EMPLOYMENT节点新增GROSSINCOME属性,值就是计算出的总和; - 保留原节点的所有属性和子节点内容,不破坏原有结构。
完整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
相关产品推荐
相关产品推荐

