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

XSLT1.0使用Muenchian法按单个Items节点分组去重的实现问题

问题解决

问题根源

  • 你当前定义的key是全局范围的,没有将Item所属的父Items节点纳入分组依据,导致跨不同Items节点的符合条件的Item被合并去重
  • 分组键仅使用了input/@quantity,没有结合type字段,不符合「type和quantity联合去重」的需求

调整方案

  1. 修改分组key,将父Items节点的唯一标识、type、input/@quantity三个值拼接作为分组键,保证分组范围限定在单个Items节点内,且按两个字段联合去重
  2. 调整Muenchian分组的筛选条件,匹配调整后的分组键
  3. 增加每个Items节点对应的注释输出

调整后的核心代码

修改key定义

<xsl:key name="item-key" match="Items/Item[name='A']" use="concat(generate-id(..), '|', type, '|', input/@quantity)" />

修改循环逻辑

<xsl:for-each select="Test/Items">
    <!-- 输出对应Items节点的注释 -->
    <xsl:comment>for <xsl:value-of select="position()"/>st item</xsl:comment>
    <!-- 按当前Items节点内的分组筛选去重 -->
    <xsl:for-each select="Item[name='A'][count(. | key('item-key', concat(generate-id(current()), '|', type, '|', input/@quantity))[1]) = 1]">
        <fo:block>
            <xsl:value-of select="type"/>
            <fo:inline color="white">XXX</fo:inline>
            <xsl:value-of select="input/@quantity"/>
        </fo:block>
    </xsl:for-each>
</xsl:for-each>

完整修改后XSLT代码

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
   xmlns:date="http://exslt.org/dates-and-times"
    xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl"
    extension-element-prefixes="date"
    >
    <!-- 修改后的分组key -->
    <xsl:key name="item-key" match="Items/Item[name='A']" use="concat(generate-id(..), '|', type, '|', input/@quantity)" /> 
    
    <xsl:template match="/" name="Barcode">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="ManufacturLabelSize-first" page-height="297mm" page-width="210mm"  margin-top="25.4mm" margin-right="25.4mm" margin-left="25.4mm" margin-bottom="25.4mm">
                    <fo:region-body margin-top="15mm" />
                    <fo:region-before />
                    <fo:region-after />
                </fo:simple-page-master>
                <fo:simple-page-master master-name="ManufacturLabelSize-rest" page-height="297mm" page-width="210mm"   margin-top="25.4mm" margin-right="25.4mm" margin-left="25.4mm" margin-bottom="25.4mm">
                    <fo:region-body margin-top="15mm"/>
                    <fo:region-before />
                    <fo:region-after />
                </fo:simple-page-master>
                <fo:page-sequence-master master-name="ManufacturLabelSize-portrait">
                    <fo:repeatable-page-master-alternatives>
                        <fo:conditional-page-master-reference master-reference="ManufacturLabelSize-first" 
                            page-position="first"/>
                        <fo:conditional-page-master-reference master-reference="ManufacturLabelSize-rest" 
                            page-position="rest"/>
                    </fo:repeatable-page-master-alternatives>
                </fo:page-sequence-master>
            </fo:layout-master-set>
            
            <fo:page-sequence master-reference="ManufacturLabelSize-portrait" id="pSeqID">
                <fo:flow flow-name="xsl-region-body">
                    <fo:table>
                        <fo:table-body border="solid" border-width="0.5pt">
                            <fo:table-row>
                                <fo:table-cell>
                                    <fo:block>
                                        <!-- 修改后的循环逻辑 -->
                                        <xsl:for-each select="Test/Items">
                                            <xsl:comment>for <xsl:value-of select="position()"/>st item</xsl:comment>
                                            <xsl:for-each select="Item[name='A'][count(. | key('item-key', concat(generate-id(current()), '|', type, '|', input/@quantity))[1]) = 1]">
                                                <fo:block>
                                                    <xsl:value-of select="type"/>
                                                    <fo:inline color="white">XXX</fo:inline>
                                                    <xsl:value-of select="input/@quantity"/>
                                                </fo:block>
                                            </xsl:for-each>
                                        </xsl:for-each>
                                    </fo:block>
                                </fo:table-cell>
                            </fo:table-row>
                        </fo:table-body>          
                    </fo:table> 
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template> 
</xsl:stylesheet>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:45:03