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

XSLT按唯一CODE筛选:仅SHIPPING122配送单商品金额求和

解决SHIPPING122配送单下商品AMOUNT分组求和问题

看来你已经搞定了通用的商品分组求和,但卡在了仅筛选特定配送单下商品这个关键点上。核心问题在于:得先把属于SHIPPING122的商品单独筛选出来,再进行分组,而不是先对所有商品分组再事后过滤——这也是你之前添加过滤条件没生效的原因。

核心逻辑拆解

我们需要完成三件事:

  • 精准定位属于SHIPPING122配送单的商品
  • 对这些商品按CODE唯一分组,求和AMOUNT字段
  • 保留SHIPPING122的配送项本身到输出结果中

XSLT 1.0解决方案(Muenchian分组)

如果你的环境只能用XSLT 1.0,经典的Muenchian分组就能解决,关键是在定义分组键时就过滤出目标商品:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- 定义分组键:仅匹配属于SHIPPING122订单的商品 -->
    <!-- 这里假设商品和配送单通过COUNT字段关联,可根据实际数据结构调整匹配规则 -->
    <xsl:key 
        name="targetProducts" 
        match="ITEM[not(starts-with(CODE, 'SHIPPING')) and COUNT = //ITEM[CODE='SHIPPING122']/COUNT]" 
        use="CODE"
    />

    <xsl:template match="/">
        <ITEMS>
            <!-- 对筛选后的商品按CODE分组求和 -->
            <xsl:for-each select="ITEM[not(starts-with(CODE, 'SHIPPING')) and COUNT = //ITEM[CODE='SHIPPING122']/COUNT][generate-id() = generate-id(key('targetProducts', CODE)[1])]">
                <ITEM>
                    <NAME><xsl:value-of select="NAME"/></NAME>
                    <CODE><xsl:value-of select="CODE"/></CODE>
                    <AMOUNT>
                        <xsl:value-of select="sum(key('targetProducts', CODE)/AMOUNT)"/>
                    </AMOUNT>
                </ITEM>
            </xsl:for-each>

            <!-- 保留SHIPPING122的配送项 -->
            <xsl:copy-of select="//ITEM[CODE='SHIPPING122']"/>
        </ITEMS>
    </xsl:template>
</xsl:stylesheet>

更简洁的XSLT 2.0+方案

如果可以使用XSLT 2.0或更高版本,for-each-group语法会更直观,代码可读性更强:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <ITEMS>
            <!-- 直接筛选目标商品并分组求和 -->
            <xsl:for-each-group 
                select="ITEM[not(starts-with(CODE, 'SHIPPING')) and COUNT = //ITEM[CODE='SHIPPING122']/COUNT]" 
                group-by="CODE"
            >
                <ITEM>
                    <NAME><xsl:value-of select="current-group()[1]/NAME"/></NAME>
                    <CODE><xsl:value-of select="current-grouping-key()"/></CODE>
                    <AMOUNT><xsl:value-of select="sum(current-group()/AMOUNT)"/></AMOUNT>
                </ITEM>
            </xsl:for-each-group>

            <!-- 复制配送项到输出 -->
            <xsl:copy-of select="ITEM[CODE='SHIPPING122']"/>
        </ITEMS>
    </xsl:template>
</xsl:stylesheet>

针对结构化订单的优化(如果你的XML有节点)

如果原始XML是按<ORDER>节点组织的(每个订单包含商品和配送项),可以把关联条件改成更准确的父节点匹配,避免依赖COUNT字段:

<xsl:for-each-group 
    select="ORDER[ITEM/CODE='SHIPPING122']/ITEM[not(starts-with(CODE, 'SHIPPING'))]" 
    group-by="CODE"
>
<!-- 后续求和逻辑和之前一致 -->
</xsl:for-each-group>

这样就能100%保证只统计SHIPPING122订单下的商品,不会出现数据混淆。

内容的提问来源于stack exchange,提问作者Ivan Špringr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:22:57