XSLT按Name分组后对Status为Draft的Amount字段条件求和问题
XSLT分组条件求和修复方案
问题根因
你当前XSLT中Charges_Draft字段的求和逻辑错误:
原表达式sum(current-group()/wd:Amount[current-group()/wd:Status = 'Draft'])的判断逻辑为:只要分组内存在任意一个状态为Draft的条目,就将分组内所有Amount值全部纳入求和,因此得到了错误的60结果。
修复方法
将Charges_Draft对应的求和表达式修改为:先过滤分组内状态为Draft的条目,再对这些条目的Amount值求和,即sum(current-group()[wd:Status = 'Draft']/wd:Amount)。
完整修复后的XSLT代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.test/bsvc" exclude-result-prefixes="wd"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:for-each-group select="wd:Data/wd:Entry" group-by="wd:Name"> <Details> <ID> <xsl:value-of select="wd:ID"/> </ID> <Name> <xsl:value-of select="wd:Name"/> </Name> <Total_Unverified_Amount> <xsl:value-of select='format-number(sum(current-group()/wd:Amount),"##.00")'/> </Total_Unverified_Amount> <Charges_Draft> <xsl:value-of select="sum(current-group()[wd:Status = 'Draft']/wd:Amount)"/> </Charges_Draft> </Details> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
输出结果
运行上述代码后即可得到你期望的输出:
<Details> <ID>123</ID> <Name>ABC</Name> <Total_Unverified_Amount>60.00</Total_Unverified_Amount> <Charges_Draft>50</Charges_Draft> </Details>
内容的提问来源于stack exchange,提问作者user9324800
相关产品推荐
相关产品推荐

