Oject-10438

Merging all HUs into single message with multiple XMLSSCCGROUPS
This commit is contained in:
Christian Schwarz
2026-03-12 14:11:17 +01:00
parent 5c59f8de6e
commit e7f5ce43bc
+166 -254
View File
@@ -1,258 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- 11.03.2026 Oject-10438 Merging all HUs into single message with multiple XMLSSCCGROUPS-->
<!-- 22.12.2023 DEV-8311 SAP sends delivery advices to stores MAPPING: SOURCE <!-- 22.12.2023 DEV-8311 SAP sends delivery advices to stores MAPPING: SOURCE
- SAP ZFSHDLV TARGET - syspro internal Format --> - SAP ZFSHDLV TARGET - syspro internal Format -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge" xmlns:map="java.util.Map" xmlns:dyn="com.sap.aii.mapping.api.DynamicConfiguration" xmlns:key="com.sap.aii.mapping.api.DynamicConfigurationKey" exclude-result-prefixes="xs map key dyn"> <xsl:stylesheet version="2.0"
<xsl:output method="xml" indent="yes"/> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
<xsl:strip-space elements="*"/> xmlns:xs="http://www.w3.org/2001/XMLSchema"
<xsl:param name="inputparam"/> xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"
<xsl:template match="/" name="DELIVERY"> exclude-result-prefixes="xs ns0">
<ns0:Messages>
<ns0:Message1> <xsl:output method="xml" indent="yes"/>
<xsl:apply-templates/> <xsl:strip-space elements="*"/>
</ns0:Message1>
</ns0:Messages> <!-- Wurzel-Template: nur eine Nachricht -->
</xsl:template> <xsl:template match="/">
<xsl:template match="//ZFSHDLV/IDOC" name="checkForHandlingUnit"> <ns0:Messages>
<xsl:if test="./E1EDL20/E1EDL37"> <ns0:Message1>
<xsl:call-template name="HandlingUnit"/> <xsl:apply-templates select="//ZFSHDLV/IDOC"/>
</xsl:if> </ns0:Message1>
<xsl:if test="not(./E1EDL20/E1EDL37)"> </ns0:Messages>
<xsl:call-template name="WithOutHandlingUnits"/> </xsl:template>
</xsl:if>
</xsl:template> <!-- Template für IDOC: eine einzige XMLDESADV -->
<xsl:template name="Message"> <xsl:template match="ZFSHDLV/IDOC">
<xsl:param name="CASE"/> <XMLDESADV>
<xsl:param name="ID"/> <!-- Header -->
<xsl:param name="SSCCID"/> <XMLDESADVHEADER>
<xsl:param name="POSITIONS"/> <!-- DocumentId mit erster SSCC -->
<xsl:variable name="PackageCode"> <DocumentId>
<xsl:value-of select="'33E'"/> <xsl:value-of select="E1EDL20/VBELN"/>
</xsl:variable> </DocumentId>
<xsl:variable name="PackageType">
<xsl:value-of select="'BJ'"/> <!-- DeliveryNote: LIFEX oder VBELN -->
</xsl:variable> <DeliveryNote>
<XMLDESADV> <xsl:value-of select="if (E1EDL20/LIFEX) then E1EDL20/LIFEX else E1EDL20/VBELN"/>
<XMLDESADVHEADER> </DeliveryNote>
<DocumentId>
<xsl:value-of select="$ID"/> <DocumentType>XMLDESADV</DocumentType>
</DocumentId> <DocumentSubType>
<DeliveryNote> <xsl:call-template name="DocumentSubType">
<xsl:choose> <xsl:with-param name="LFART" select="E1EDL21/LFART"/>
<xsl:when test="//ZFSHDLV/IDOC/E1EDL20/LIFEX/node()"> </xsl:call-template>
<xsl:value-of select="//ZFSHDLV/IDOC/E1EDL20/LIFEX"/> </DocumentSubType>
</xsl:when>
<xsl:otherwise> <!-- DocumentDate (QUALF='015') -->
<xsl:value-of select="//ZFSHDLV/IDOC/E1EDL20/VBELN"/> <DocumentDate>
</xsl:otherwise> <xsl:value-of
</xsl:choose> select="format-dateTime(
</DeliveryNote> adjust-dateTime-to-timezone(
<DocumentType> xs:dateTime(concat(
<xsl:value-of select="'XMLDESADV'"/> substring(E1EDL20/E1EDT13[QUALF='015']/NTANF,1,4),'-',
</DocumentType> substring(E1EDL20/E1EDT13[QUALF='015']/NTANF,5,2),'-',
<DocumentSubType> substring(E1EDL20/E1EDT13[QUALF='015']/NTANF,7,2),'T',
<xsl:call-template name="DocumentSubType"> substring(E1EDL20/E1EDT13[QUALF='015']/NTANZ,1,2),':',
<xsl:with-param name="LFART"> substring(E1EDL20/E1EDT13[QUALF='015']/NTANZ,3,2),':',
<xsl:value-of select="../E1EDL21/LFART"/> substring(E1EDL20/E1EDT13[QUALF='015']/NTANZ,5,2)
</xsl:with-param> ))),
</xsl:call-template> '[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')
</DocumentSubType> "/>
<DocumentDate> </DocumentDate>
<xsl:value-of select="format-dateTime(adjust-dateTime-to-timezone(xs:dateTime(concat(
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANF,1,4), <!-- DeliveryDate (QUALF='007') -->
'-', <DeliveryDate>
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANF,5,2), <xsl:value-of
'-', select="format-dateTime(
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANF,7,2), adjust-dateTime-to-timezone(
'T', xs:dateTime(concat(
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANZ,1,2), substring(E1EDL20/E1EDT13[QUALF='007']/NTANF,1,4),'-',
':', substring(E1EDL20/E1EDT13[QUALF='007']/NTANF,5,2),'-',
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANZ,3,2), substring(E1EDL20/E1EDT13[QUALF='007']/NTANF,7,2),'T',
':', substring(E1EDL20/E1EDT13[QUALF='007']/NTANZ,1,2),':',
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANZ,5,2)))), substring(E1EDL20/E1EDT13[QUALF='007']/NTANZ,3,2),':',
'[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')"/> substring(E1EDL20/E1EDT13[QUALF='007']/NTANZ,5,2)
</DocumentDate> ))),
<DeliveryDate> '[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')
<xsl:value-of select="format-dateTime(adjust-dateTime-to-timezone(xs:dateTime(concat( "/>
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANF,1,4), </DeliveryDate>
'-',
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANF,5,2), <!-- GLNs -->
'-', <SenderGLN><xsl:value-of select="E1IDOCENHANCEMENT[IDENTIFIER='SENDERGLN']/DATA"/></SenderGLN>
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANF,7,2), <ReceipientGLN><xsl:value-of select="E1IDOCENHANCEMENT[IDENTIFIER='RECEIVERGLN']/DATA"/></ReceipientGLN>
'T', <!-- leere Felder optional -->
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANZ,1,2), <AllocationReference/>
':', <ReferenceSupplierOrder/>
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANZ,3,2), <ReferenceBuyerOrder/>
':', <ReferenceDocument><xsl:value-of select="E1EDL20/VBELN"/></ReferenceDocument>
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANZ,5,2)))), <SupplierGLN/>
'[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')"/> <BuyerGLN/>
</DeliveryDate> <DeliveryPartyGLN/>
<ReferenceSupplierOrder/> <UltimateConsignyGLN/>
<ReferenceBuyerOrder/> <ReturnGLN/>
<ReferenceDocument> <SendFromGLN/>
<xsl:value-of select="$ID"/> <SendToGLN/>
</ReferenceDocument> <DeliveryCurrency/>
<AllocationReference/> </XMLDESADVHEADER>
<SenderGLN>
<xsl:value-of select="//IDOC/E1IDOCENHANCEMENT[IDENTIFIER='SENDERGLN']/DATA"/> <!-- Package Group -->
</SenderGLN> <XMLPACKAGEGROUP>
<ReceipientGLN> <NumberOfPackages>
<xsl:value-of select="//IDOC/E1IDOCENHANCEMENT[IDENTIFIER='RECEIVERGLN']/DATA"/> <xsl:value-of select="if (E1EDL20/ANZPK)
</ReceipientGLN> then format-number(E1EDL20/ANZPK, '#')
<SupplierGLN/> else '1'"/>
<BuyerGLN/> </NumberOfPackages>
<DeliveryPartyGLN/> <PackageCode>33E</PackageCode>
<UltimateConsignyGLN/> </XMLPACKAGEGROUP>
<ReturnGLN/>
<SendFromGLN/> <!-- HUs pro HU eine XMLSSCCGROUP -->
<SendToGLN/> <xsl:for-each select="E1EDL20/E1EDL37">
<DeliveryCurrency/> <XMLSSCCGROUP>
</XMLDESADVHEADER> <SSCC>
<XMLDESADV> <xsl:value-of select="
</XMLDESADV> if (string-length(translate(normalize-space(EXIDV), '0123456789', '')) != 0)
<XMLPACKAGEGROUP> then normalize-space(EXIDV)
<NumberOfPackages> else replace(normalize-space(EXIDV), '^0+', '')
<xsl:choose> "/>
<xsl:when test="number(format-number(../../../IDOC/E1EDL20/ANZPK,'#')) > 0 "> </SSCC>
<xsl:value-of select="format-number(../../../IDOC/E1EDL20/ANZPK,'#')"/> <PackageCode>33E</PackageCode>
</xsl:when> <PackageType>BJ</PackageType>
<xsl:otherwise>
<xsl:copy-of select="1"/> <!-- Artikel für diese HU -->
</xsl:otherwise> <xsl:for-each select="E1EDL44">
</xsl:choose> <xsl:variable name="posnr" select="POSNR"/>
</NumberOfPackages> <XMLITEMS>
<PackageCode> <PositionNumber><xsl:value-of select="$posnr"/></PositionNumber>
<xsl:value-of select="$PackageCode"/> <GTIN><xsl:value-of select="../../../E1EDL20/E1EDL24[POSNR = $posnr]/EAN11"/></GTIN>
</PackageCode> <DeliveredQuantity>
</XMLPACKAGEGROUP> <xsl:value-of select="xs:decimal(./VEMNG)"/>
<XMLSSCCGROUP> </DeliveredQuantity>
<SSCC> <QuantityQualifier>
<xsl:value-of select="$SSCCID"/> <xsl:call-template name="QuantityQualifier">
</SSCC> <xsl:with-param name="UoM" select="./VEMEH"/>
<PackageCode> </xsl:call-template>
<xsl:value-of select="$PackageCode"/> </QuantityQualifier>
</PackageCode> <ReferenceSupplierOrder>
<PackageType> <xsl:value-of select="../../../E1EDL20/E1EDL24[POSNR = $posnr]/VGBEL"/>
<xsl:value-of select="$PackageType"/> </ReferenceSupplierOrder>
</PackageType>
<xsl:copy-of select="$POSITIONS"/> <!-- EPCs -->
</XMLSSCCGROUP> <xsl:if test="E1EPC03">
</XMLDESADV> <xsl:for-each select="E1EPC03[URN and string-length(normalize-space(URN)) > 0]">
</xsl:template> <XMLEPC>
<xsl:template name="WithOutHandlingUnits"> <EPC><xsl:value-of select="normalize-space(URN)"/></EPC>
<xsl:variable name="POSITIONS"> </XMLEPC>
<xsl:for-each select="./E1EDL20/E1EDL24"> </xsl:for-each>
<XMLITEMS> </xsl:if>
<PositionNumber> </XMLITEMS>
<xsl:value-of select="./POSNR"/> </xsl:for-each>
</PositionNumber> </XMLSSCCGROUP>
<GTIN> </xsl:for-each>
<xsl:value-of select="./EAN11"/> </XMLDESADV>
</GTIN> </xsl:template>
<DeliveredQuantity>
<xsl:value-of select="xs:decimal(./LGMNG)"/> <!-- Hilfs-Templates -->
</DeliveredQuantity> <xsl:template name="DocumentSubType">
<QuantityQualifier> <xsl:param name="LFART"/>
<xsl:call-template name="QuantityQualifier"> <xsl:choose>
<xsl:with-param name="UoM"> <xsl:when test="$LFART = 'ZIL'">DESADV_IBT</xsl:when>
<xsl:value-of select="./MEINS"/> <xsl:otherwise>DESADV_GI</xsl:otherwise>
</xsl:with-param> </xsl:choose>
</xsl:call-template> </xsl:template>
</QuantityQualifier>
<DeliveryPrice/> <xsl:template name="QuantityQualifier">
<ReferenceSupplierOrder> <xsl:param name="UoM"/>
<xsl:value-of select="./VGBEL"/> <xsl:choose>
</ReferenceSupplierOrder> <xsl:when test="$UoM = 'PCE'">12</xsl:when>
<ReferenceBuyerOrder/> <xsl:otherwise>999</xsl:otherwise>
</XMLITEMS> </xsl:choose>
</xsl:for-each> </xsl:template>
</xsl:variable>
<xsl:call-template name="Message">
<xsl:with-param name="CASE" select="'NoHandlingUnit'"/>
<xsl:with-param name="ID" select="./E1EDL20/VBELN"/>
<xsl:with-param name="SSCCID" select="./E1EDL20/VBELN"/>
<xsl:with-param name="POSITIONS" select="$POSITIONS"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="HandlingUnit">
<xsl:for-each select="./E1EDL20/E1EDL37">
<!-- Looping over all E1EDL37 segments and create a new message -->
<xsl:variable name="POSITIONS">
<xsl:for-each select="./E1EDL44">
<xsl:variable name="position" select="./POSNR"/>
<XMLITEMS>
<PositionNumber>
<xsl:value-of select="$position"/>
</PositionNumber>
<GTIN>
<xsl:value-of select="../../E1EDL24[POSNR = $position]/EAN11"/>
</GTIN>
<DeliveredQuantity>
<xsl:value-of select="xs:decimal(../../E1EDL24[POSNR = $position]/LGMNG)"/>
</DeliveredQuantity>
<QuantityQualifier>
<xsl:call-template name="QuantityQualifier">
<xsl:with-param name="UoM">
<xsl:value-of select="../../E1EDL24[POSNR = $position]/MEINS"/>
</xsl:with-param>
</xsl:call-template>
</QuantityQualifier>
<DeliveryPrice/>
<ReferenceSupplierOrder>
<xsl:value-of select="../../E1EDL24[POSNR = $position]/VGBEL"/>
</ReferenceSupplierOrder>
<ReferenceBuyerOrder/>
<xsl:if test="exists(./E1EPC03)">
<xsl:for-each select="./E1EPC03">
<xsl:if test="exists(./URN) and (./URN != '')">
<XMLEPC>
<EPC>
<xsl:value-of select="./URN"/>
</EPC>
</XMLEPC>
</xsl:if>
</xsl:for-each>
</xsl:if>
</XMLITEMS>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="EXIDV">
<xsl:choose>
<xsl:when test="string-length(translate(./EXIDV, '0123456789', '')) != 0">
<xsl:value-of select="./EXIDV"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="replace(./EXIDV, '^0+', '')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="Message">
<xsl:with-param name="CASE" select="'HandlingUnit'"/>
<xsl:with-param name="ID" select="concat(../VBELN,'_',./EXIDV)"/>
<xsl:with-param name="SSCCID" select="$EXIDV"/>
<xsl:with-param name="POSITIONS" select="$POSITIONS"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="DocumentSubType">
<xsl:param name="LFART"/>
<xsl:choose>
<xsl:when test="$LFART = 'ZIL'">
<xsl:value-of select="'DESADV_IBT'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'DESADV_GI'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="QuantityQualifier">
<xsl:param name="UoM"/>
<xsl:choose>
<xsl:when test="$UoM = 'PCE'">
<xsl:value-of select="'12'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'999'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>