首页 > 解决方案 > XSLT 内容值分组

问题描述

我想根据包 1 和包 2 两个级别的数量进行分组,并计算其数量和唯一数量。但是在 pack-2 的情况下,其总数量是通过将其 ShippingContainerSerialCode 与 pack-2 ShippingContainerSerialCodeReference 匹配来计算的(这里也应根据数量进行分组)

我认为我在提供正确的密钥匹配方面犯了一些错误。我不擅长 xslt 分组。

任何人都可以建议我正确的方法。您的帮助非常有价值!

XML 代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.051/Fulfill.dtd">
<cXML payloadID="1635170275462-2062249151902811705@10.162.97.172" timestamp="2021-10-25T06:57:55-07:00" xml:lang="en-PL">
    <Request deploymentMode="test">
        <Header>
            <Items>
                <Item shipNoticeLineNumber="1" lineNumber="10" quantity="101">
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001661</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001660</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>1</PackCode>
                        <PackageTypeCodeIdentifierCode>MBPALLET001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001660</ShippingContainerSerialCode>
                        <DispatchQuantity quantity="6.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001662</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001660</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001663</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001660</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001664</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001660</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001665</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001660</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001666</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001660</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="1.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                </Item>
                <Item shipNoticeLineNumber="2" lineNumber="20" quantity="201">
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001668</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001667</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>1</PackCode>
                        <PackageTypeCodeIdentifierCode>MBPALLET001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001667</ShippingContainerSerialCode>
                        <DispatchQuantity quantity="6.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001669</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001667</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001670</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001667</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001671</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001667</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001672</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001667</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001673</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001667</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001675</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001674</ShippingContainerSerialCodeReference>
                        <PackageID></PackageID>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>1</PackCode>
                        <PackageTypeCodeIdentifierCode>MBPALLET001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001674</ShippingContainerSerialCode>
                        <DispatchQuantity quantity="5.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001676</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001674</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001677</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001674</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001678</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001674</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="20.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                    <Pack>
                        <PackCode>2</PackCode>
                        <PackageTypeCodeIdentifierCode>MBCARTON001</PackageTypeCodeIdentifierCode>
                        <ShippingContainerSerialCode>1800001679</ShippingContainerSerialCode>
                        <ShippingContainerSerialCodeReference>1800001674</ShippingContainerSerialCodeReference>
                        <DispatchQuantity quantity="1.0">
                            <UnitOfMeasure>EA</UnitOfMeasure>
                        </DispatchQuantity>
                    </Pack>
                </Item>
                
            </Items>
        </Header>
    </Request>
</cXML>

XSLT 编码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:dew="com.ariba.microservices.anuiextensions.service.data.ANDataCxmlExtension" 
    xmlns:dew1="com.ariba.microservices.scm.micro.serivce.data.ANDataCxmlExtension"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:barcode="http://barcode4j.krysalis.org/ns"
    xmlns:date="http://exslt.org/dates-and-times"
    
    extension-element-prefixes="date"
    
    >
   
    <xsl:key name="pack-2-key" match="Pack/PackageTypeCodeIdentifierCode" use="DispatchQuantity/@quantity" /> 
    
  
    
    <xsl:output method="xml" indent="yes" />
    
   
    <xsl:decimal-format name="generalFormat" grouping-separator="," decimal-separator="." /> 
    <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:call-template name="line"></xsl:call-template>
                                     </fo:block>
                                    
                                </fo:table-cell>
                            </fo:table-row>
                        </fo:table-body>          
                    </fo:table> 
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
        
     </xsl:template> 
    
    
    <xsl:template name="line">
        <fo:table  >
            
            <fo:table-body >
                <xsl:apply-templates
                    select="cXML/Request/Header/Items/Item"/>
                
            </fo:table-body>
        </fo:table>
    </xsl:template>
    
    <xsl:template match="Item" name="palletCarton3">
        
        
            <fo:table-row>
            
                
                <fo:table-cell width="28mm" height="25mm" padding-before="2.5mm">
                   
                    <fo:block font-size="8" font-family="Calibri" padding-before="4mm" start-indent="0.75mm">
                        <fo:inline color="white">XXXXX</fo:inline>
                    </fo:block>
                    <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                        <fo:inline>
                            <xsl:if test="Pack[PackCode='1']!=''"> 
                                <xsl:value-of select="count(Pack[PackCode='1'])"/>
                            </xsl:if>
                        </fo:inline>
                        
                    </fo:block>
                    
                    <xsl:if test="Pack[PackCode='2']!=''"> 
                      <xsl:for-each select="Pack[PackCode='2'][count(. | key('pack-2-key',DispatchQuantity/@quantity)[1]) = 1]">
                        <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                            <xsl:value-of select="count(../Pack[PackCode='2'][DispatchQuantity/@quantity = current()/DispatchQuantity/@quantity])"/>
                        </fo:block>
                     </xsl:for-each>
                    </xsl:if>
                  
                </fo:table-cell>
                
                <fo:table-cell width="25mm" height="20mm" padding-before="2.5mm">
                    <fo:block font-size="8" font-family="Calibri">
                        <fo:inline color="white">XXXXXX</fo:inline>
                    </fo:block>
                    <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                        <fo:inline color="white">XXXXXX</fo:inline>
                    </fo:block>
                    
                    <xsl:if test="Pack[PackCode='1']!=''">
                     <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                         <xsl:value-of select="Pack[PackCode='1']/PackageTypeCodeIdentifierCode"/>  
                     </fo:block>
                    </xsl:if>
                    
                    <xsl:if test="Pack[PackCode='2']!=''">
                        <xsl:for-each select="Pack[PackCode='2'][count(. | key('pack-2-key',DispatchQuantity/@quantity)[1]) = 1]">
                            <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                                <xsl:value-of select="PackageTypeCodeIdentifierCode"/>
                            </fo:block>
                        </xsl:for-each>
                     </xsl:if>
                  
                </fo:table-cell>
                
                <fo:table-cell width="12mm" height="20mm" padding-before="2.5mm">
                    <fo:block font-size="8" font-family="Calibri">
                        <!--Field Length:14-->
                        <fo:inline> <xsl:value-of select="substring(@quantity,'1','14')"/></fo:inline>
                    </fo:block>
                    <fo:block font-size="8" font-family="Calibri">
                        <fo:inline color="white">XXXXXX</fo:inline>
                    </fo:block>
                    <fo:block font-size="8" font-family="Calibri">
                        <fo:inline color="white">XXXXXX</fo:inline>
                    </fo:block>
                </fo:table-cell>
                
               
                
                <fo:table-cell width="47mm" height="20mm" padding-before="2.5mm">
                    <fo:block font-size="8" font-family="Calibri">
                        <fo:inline color="white">XXXX</fo:inline>  <fo:inline color="white">V987654</fo:inline>  <fo:inline color="white">XXXXX</fo:inline> 
                    </fo:block>
                    <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                        <fo:inline color="white">XXXX</fo:inline>
                    </fo:block>
                    
                    <xsl:variable name="pack1">
                        <xsl:value-of select="Pack[PackCode='1']"/>
                    </xsl:variable>
                    
                    <xsl:variable name="pack2">
                        <xsl:value-of select="Pack[PackCode='2']"/>
                    </xsl:variable>
                    
                    <xsl:if test="$pack1!=''">
                    <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                        
                        <fo:inline>
                            <xsl:if test="$pack2=''">
                                <xsl:value-of select="format-number((Pack[PackCode='1'][1]/DispatchQuantity[1]/@quantity),'###0.00')"/>  
                            </xsl:if>
                            <xsl:if test="$pack2!='' and $pack1!=''">
                                <xsl:value-of select="format-number((Pack[PackCode='1'][1]/DispatchQuantity[1]/@quantity) * (Pack[PackCode='2']/DispatchQuantity[1]/@quantity),'###0.00')"/>  
                            </xsl:if>
                        </fo:inline>
                    </fo:block>
                    </xsl:if>
                    
                   
                    
                    <xsl:variable name="pack3">
                        <xsl:value-of select="Pack[PackCode='3']"/>
                    </xsl:variable>
                    
                    <xsl:if test="$pack2!=''">
                        <xsl:for-each select="Pack[PackCode='2'][count(. | key('pack-2-key',DispatchQuantity/@quantity)[1]) = 1]">
                            <fo:block font-size="8" font-family="Calibri" padding-before="2mm" start-indent="0.75mm">
                                <xsl:value-of select="format-number((DispatchQuantity/@quantity),'###0.00')"/>
                            </fo:block>
                        </xsl:for-each>
                     
                    </xsl:if>
                  </fo:table-cell>
             </fo:table-row>
     </xsl:template>
    
    

</xsl:stylesheet>  
Expected Output:
      
      101
1   1 MBPALLET001   101.00
    5 MBCARTON001    20.00
    1 MBCARTON001    1.00
    
    201
2   1 MBPALLET001   120.00
    1 MBPALLET001   81.00
    10 MBCARTON001  20.00
    1 MBCARTON001    1.00
    
    
    
Current Output:
      101
1   1 MBPALLET001   101.00
    5 MBCARTON001    20.00
    5 MBCARTON001    20.00
    5 MBCARTON001    20.00
    5 MBCARTON001    20.00
    5 MBCARTON001    20.00
    1 MBCARTON001    1.00
    
    201
2   1 MBPALLET001   120.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    10 MBCARTON001  20.00
    1 MBCARTON001    1.00
    
    


 

标签: xsltgroup-bykey

解决方案


推荐阅读