XSLT1.0使用Muenchian法按单个Items节点分组去重的实现问题
问题解决
问题根源
- 你当前定义的key是全局范围的,没有将
Item所属的父Items节点纳入分组依据,导致跨不同Items节点的符合条件的Item被合并去重 - 分组键仅使用了
input/@quantity,没有结合type字段,不符合「type和quantity联合去重」的需求
调整方案
- 修改分组key,将父
Items节点的唯一标识、type、input/@quantity三个值拼接作为分组键,保证分组范围限定在单个Items节点内,且按两个字段联合去重 - 调整Muenchian分组的筛选条件,匹配调整后的分组键
- 增加每个
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
相关产品推荐
相关产品推荐

