xslt - 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
解决方案
推荐阅读
- vba - Word VBA 问题打印到 PDF
- gatsby - 有没有办法避免在 Gatsby 中使用某些路径构建页面?
- docker - 在不停止整个容器的情况下停止在 docker 容器内运行的服务
- javascript - 我如何在 firestore 字段的数组字段中循环并检索最后一个对其具有真实价值的结果?
- python - 在 tkinter 中调整图片大小时遇到问题
- nginx - NGINX 不支持 tls1.2 密码
- c++ - 为什么我不能在 std::array< int, 3 > 的指针上使用运算符 [] 来索引值?
- google-apps-script - 使用谷歌脚本评估/计算连接语句
- android - 如何在 Room 中创建具有自动递增字段的新实体对象?
- node.js - Node.js 设计方法。服务器定期从客户端轮询