XSLT实现pack-1/pack-2两层按数量分组及关联统计求助
XSLT多层级分组正确实现方案
实现逻辑
- pack-1层级直接以自身数量字段为分组键,分组后统计每组节点数即可得到对应计数
- pack-2层级先通过
ShippingContainerSerialCode和ShippingContainerSerialCodeReference的关联关系计算单节点总数量,再以总数量为分组键统计计数
完整XSLT代码(XSLT 2.0+)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义pack-2节点按ShippingContainerSerialCode匹配的key --> <xsl:key name="pack2-by-serial" match="pack-2" use="ShippingContainerSerialCode"/> <xsl:template match="/"> <GroupResult> <!-- 处理pack-1层级分组 --> <Pack1Groups> <xsl:for-each-group select="//pack-1" group-by="Quantity"> <Group quantity="{current-grouping-key()}" count="{count(current-group())}"/> </xsl:for-each-group> </Pack1Groups> <!-- 处理pack-2层级分组 --> <Pack2Groups> <!-- 先计算所有pack-2的关联总数量,再按总数量分组 --> <xsl:for-each-group select="//pack-2" group-by="sum(Quantity | key('pack2-by-serial', ShippingContainerSerialCodeReference)/Quantity)"> <Group totalQuantity="{current-grouping-key()}" count="{count(current-group())}"/> </xsl:for-each-group> </Pack2Groups> </GroupResult> </xsl:template> </xsl:stylesheet>
重复分组问题修复说明
- 反向定义key匹配规则:key的匹配值应设为
ShippingContainerSerialCode,查询时传入关联字段ShippingContainerSerialCodeReference的值,反向设置会导致关联匹配错误,产生冗余分组 - 未先计算总数量再分组:如果先按原始数量分组再关联计算总数量,会导致同一总数量被拆分到多个分组,出现重复条目
- 计数逻辑重复遍历节点:使用
current-group()直接统计当前分组的节点数,避免二次遍历导致的计数错误
若使用XSLT 1.0版本,需采用Muenchian分组法实现,核心key定义逻辑与上述一致,分组语法调整为判断当前节点是否为同分组的首个节点即可。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

