Oject-10438
Merging all HUs into single message with multiple XMLSSCCGROUPS
This commit is contained in:
@@ -1,103 +1,89 @@
|
||||
<?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
|
||||
- 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:output method="xml" indent="yes"/>
|
||||
<xsl:strip-space elements="*"/>
|
||||
<xsl:param name="inputparam"/>
|
||||
<xsl:template match="/" name="DELIVERY">
|
||||
<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"
|
||||
exclude-result-prefixes="xs ns0">
|
||||
|
||||
<xsl:output method="xml" indent="yes"/>
|
||||
<xsl:strip-space elements="*"/>
|
||||
|
||||
<!-- Wurzel-Template: nur eine Nachricht -->
|
||||
<xsl:template match="/">
|
||||
<ns0:Messages>
|
||||
<ns0:Message1>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:apply-templates select="//ZFSHDLV/IDOC"/>
|
||||
</ns0:Message1>
|
||||
</ns0:Messages>
|
||||
</xsl:template>
|
||||
<xsl:template match="//ZFSHDLV/IDOC" name="checkForHandlingUnit">
|
||||
<xsl:if test="./E1EDL20/E1EDL37">
|
||||
<xsl:call-template name="HandlingUnit"/>
|
||||
</xsl:if>
|
||||
<xsl:if test="not(./E1EDL20/E1EDL37)">
|
||||
<xsl:call-template name="WithOutHandlingUnits"/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
<xsl:template name="Message">
|
||||
<xsl:param name="CASE"/>
|
||||
<xsl:param name="ID"/>
|
||||
<xsl:param name="SSCCID"/>
|
||||
<xsl:param name="POSITIONS"/>
|
||||
<xsl:variable name="PackageCode">
|
||||
<xsl:value-of select="'33E'"/>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="PackageType">
|
||||
<xsl:value-of select="'BJ'"/>
|
||||
</xsl:variable>
|
||||
</xsl:template>
|
||||
|
||||
<!-- Template für IDOC: eine einzige XMLDESADV -->
|
||||
<xsl:template match="ZFSHDLV/IDOC">
|
||||
<XMLDESADV>
|
||||
<!-- Header -->
|
||||
<XMLDESADVHEADER>
|
||||
<!-- DocumentId mit erster SSCC -->
|
||||
<DocumentId>
|
||||
<xsl:value-of select="$ID"/>
|
||||
<xsl:value-of select="E1EDL20/VBELN"/>
|
||||
</DocumentId>
|
||||
|
||||
<!-- DeliveryNote: LIFEX oder VBELN -->
|
||||
<DeliveryNote>
|
||||
<xsl:choose>
|
||||
<xsl:when test="//ZFSHDLV/IDOC/E1EDL20/LIFEX/node()">
|
||||
<xsl:value-of select="//ZFSHDLV/IDOC/E1EDL20/LIFEX"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="//ZFSHDLV/IDOC/E1EDL20/VBELN"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:value-of select="if (E1EDL20/LIFEX) then E1EDL20/LIFEX else E1EDL20/VBELN"/>
|
||||
</DeliveryNote>
|
||||
<DocumentType>
|
||||
<xsl:value-of select="'XMLDESADV'"/>
|
||||
</DocumentType>
|
||||
|
||||
<DocumentType>XMLDESADV</DocumentType>
|
||||
<DocumentSubType>
|
||||
<xsl:call-template name="DocumentSubType">
|
||||
<xsl:with-param name="LFART">
|
||||
<xsl:value-of select="../E1EDL21/LFART"/>
|
||||
</xsl:with-param>
|
||||
<xsl:with-param name="LFART" select="E1EDL21/LFART"/>
|
||||
</xsl:call-template>
|
||||
</DocumentSubType>
|
||||
|
||||
<!-- DocumentDate (QUALF='015') -->
|
||||
<DocumentDate>
|
||||
<xsl:value-of select="format-dateTime(adjust-dateTime-to-timezone(xs:dateTime(concat(
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANF,1,4),
|
||||
'-',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANF,5,2),
|
||||
'-',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANF,7,2),
|
||||
'T',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANZ,1,2),
|
||||
':',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANZ,3,2),
|
||||
':',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='015']/NTANZ,5,2)))),
|
||||
'[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')"/>
|
||||
<xsl:value-of
|
||||
select="format-dateTime(
|
||||
adjust-dateTime-to-timezone(
|
||||
xs:dateTime(concat(
|
||||
substring(E1EDL20/E1EDT13[QUALF='015']/NTANF,1,4),'-',
|
||||
substring(E1EDL20/E1EDT13[QUALF='015']/NTANF,5,2),'-',
|
||||
substring(E1EDL20/E1EDT13[QUALF='015']/NTANF,7,2),'T',
|
||||
substring(E1EDL20/E1EDT13[QUALF='015']/NTANZ,1,2),':',
|
||||
substring(E1EDL20/E1EDT13[QUALF='015']/NTANZ,3,2),':',
|
||||
substring(E1EDL20/E1EDT13[QUALF='015']/NTANZ,5,2)
|
||||
))),
|
||||
'[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')
|
||||
"/>
|
||||
</DocumentDate>
|
||||
|
||||
<!-- DeliveryDate (QUALF='007') -->
|
||||
<DeliveryDate>
|
||||
<xsl:value-of select="format-dateTime(adjust-dateTime-to-timezone(xs:dateTime(concat(
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANF,1,4),
|
||||
'-',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANF,5,2),
|
||||
'-',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANF,7,2),
|
||||
'T',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANZ,1,2),
|
||||
':',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANZ,3,2),
|
||||
':',
|
||||
substring(//ZFSHDLV/IDOC/E1EDL20/E1EDT13[QUALF='007']/NTANZ,5,2)))),
|
||||
'[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')"/>
|
||||
<xsl:value-of
|
||||
select="format-dateTime(
|
||||
adjust-dateTime-to-timezone(
|
||||
xs:dateTime(concat(
|
||||
substring(E1EDL20/E1EDT13[QUALF='007']/NTANF,1,4),'-',
|
||||
substring(E1EDL20/E1EDT13[QUALF='007']/NTANF,5,2),'-',
|
||||
substring(E1EDL20/E1EDT13[QUALF='007']/NTANF,7,2),'T',
|
||||
substring(E1EDL20/E1EDT13[QUALF='007']/NTANZ,1,2),':',
|
||||
substring(E1EDL20/E1EDT13[QUALF='007']/NTANZ,3,2),':',
|
||||
substring(E1EDL20/E1EDT13[QUALF='007']/NTANZ,5,2)
|
||||
))),
|
||||
'[Y0000]-[M00]-[D00]T[H00]:[m00]:[s00].[f0000000][Z]')
|
||||
"/>
|
||||
</DeliveryDate>
|
||||
|
||||
<!-- GLNs -->
|
||||
<SenderGLN><xsl:value-of select="E1IDOCENHANCEMENT[IDENTIFIER='SENDERGLN']/DATA"/></SenderGLN>
|
||||
<ReceipientGLN><xsl:value-of select="E1IDOCENHANCEMENT[IDENTIFIER='RECEIVERGLN']/DATA"/></ReceipientGLN>
|
||||
<!-- leere Felder optional -->
|
||||
<AllocationReference/>
|
||||
<ReferenceSupplierOrder/>
|
||||
<ReferenceBuyerOrder/>
|
||||
<ReferenceDocument>
|
||||
<xsl:value-of select="$ID"/>
|
||||
</ReferenceDocument>
|
||||
<AllocationReference/>
|
||||
<SenderGLN>
|
||||
<xsl:value-of select="//IDOC/E1IDOCENHANCEMENT[IDENTIFIER='SENDERGLN']/DATA"/>
|
||||
</SenderGLN>
|
||||
<ReceipientGLN>
|
||||
<xsl:value-of select="//IDOC/E1IDOCENHANCEMENT[IDENTIFIER='RECEIVERGLN']/DATA"/>
|
||||
</ReceipientGLN>
|
||||
<ReferenceDocument><xsl:value-of select="E1EDL20/VBELN"/></ReferenceDocument>
|
||||
<SupplierGLN/>
|
||||
<BuyerGLN/>
|
||||
<DeliveryPartyGLN/>
|
||||
@@ -107,152 +93,78 @@
|
||||
<SendToGLN/>
|
||||
<DeliveryCurrency/>
|
||||
</XMLDESADVHEADER>
|
||||
<XMLDESADV>
|
||||
</XMLDESADV>
|
||||
|
||||
<!-- Package Group -->
|
||||
<XMLPACKAGEGROUP>
|
||||
<NumberOfPackages>
|
||||
<xsl:choose>
|
||||
<xsl:when test="number(format-number(../../../IDOC/E1EDL20/ANZPK,'#')) > 0 ">
|
||||
<xsl:value-of select="format-number(../../../IDOC/E1EDL20/ANZPK,'#')"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:copy-of select="1"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:value-of select="if (E1EDL20/ANZPK)
|
||||
then format-number(E1EDL20/ANZPK, '#')
|
||||
else '1'"/>
|
||||
</NumberOfPackages>
|
||||
<PackageCode>
|
||||
<xsl:value-of select="$PackageCode"/>
|
||||
</PackageCode>
|
||||
<PackageCode>33E</PackageCode>
|
||||
</XMLPACKAGEGROUP>
|
||||
|
||||
<!-- HUs – pro HU eine XMLSSCCGROUP -->
|
||||
<xsl:for-each select="E1EDL20/E1EDL37">
|
||||
<XMLSSCCGROUP>
|
||||
<SSCC>
|
||||
<xsl:value-of select="$SSCCID"/>
|
||||
<xsl:value-of select="
|
||||
if (string-length(translate(normalize-space(EXIDV), '0123456789', '')) != 0)
|
||||
then normalize-space(EXIDV)
|
||||
else replace(normalize-space(EXIDV), '^0+', '')
|
||||
"/>
|
||||
</SSCC>
|
||||
<PackageCode>
|
||||
<xsl:value-of select="$PackageCode"/>
|
||||
</PackageCode>
|
||||
<PackageType>
|
||||
<xsl:value-of select="$PackageType"/>
|
||||
</PackageType>
|
||||
<xsl:copy-of select="$POSITIONS"/>
|
||||
</XMLSSCCGROUP>
|
||||
</XMLDESADV>
|
||||
</xsl:template>
|
||||
<xsl:template name="WithOutHandlingUnits">
|
||||
<xsl:variable name="POSITIONS">
|
||||
<xsl:for-each select="./E1EDL20/E1EDL24">
|
||||
<PackageCode>33E</PackageCode>
|
||||
<PackageType>BJ</PackageType>
|
||||
|
||||
<!-- Artikel für diese HU -->
|
||||
<xsl:for-each select="E1EDL44">
|
||||
<xsl:variable name="posnr" select="POSNR"/>
|
||||
<XMLITEMS>
|
||||
<PositionNumber>
|
||||
<xsl:value-of select="./POSNR"/>
|
||||
</PositionNumber>
|
||||
<GTIN>
|
||||
<xsl:value-of select="./EAN11"/>
|
||||
</GTIN>
|
||||
<PositionNumber><xsl:value-of select="$posnr"/></PositionNumber>
|
||||
<GTIN><xsl:value-of select="../../../E1EDL20/E1EDL24[POSNR = $posnr]/EAN11"/></GTIN>
|
||||
<DeliveredQuantity>
|
||||
<xsl:value-of select="xs:decimal(./LGMNG)"/>
|
||||
<xsl:value-of select="xs:decimal(./VEMNG)"/>
|
||||
</DeliveredQuantity>
|
||||
<QuantityQualifier>
|
||||
<xsl:call-template name="QuantityQualifier">
|
||||
<xsl:with-param name="UoM">
|
||||
<xsl:value-of select="./MEINS"/>
|
||||
</xsl:with-param>
|
||||
<xsl:with-param name="UoM" select="./VEMEH"/>
|
||||
</xsl:call-template>
|
||||
</QuantityQualifier>
|
||||
<DeliveryPrice/>
|
||||
<ReferenceSupplierOrder>
|
||||
<xsl:value-of select="./VGBEL"/>
|
||||
<xsl:value-of select="../../../E1EDL20/E1EDL24[POSNR = $posnr]/VGBEL"/>
|
||||
</ReferenceSupplierOrder>
|
||||
<ReferenceBuyerOrder/>
|
||||
</XMLITEMS>
|
||||
</xsl:for-each>
|
||||
</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 != '')">
|
||||
|
||||
<!-- EPCs -->
|
||||
<xsl:if test="E1EPC03">
|
||||
<xsl:for-each select="E1EPC03[URN and string-length(normalize-space(URN)) > 0]">
|
||||
<XMLEPC>
|
||||
<EPC>
|
||||
<xsl:value-of select="./URN"/>
|
||||
</EPC>
|
||||
<EPC><xsl:value-of select="normalize-space(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>
|
||||
</XMLSSCCGROUP>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
<xsl:template name="DocumentSubType">
|
||||
</XMLDESADV>
|
||||
</xsl:template>
|
||||
|
||||
<!-- Hilfs-Templates -->
|
||||
<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:when test="$LFART = 'ZIL'">DESADV_IBT</xsl:when>
|
||||
<xsl:otherwise>DESADV_GI</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
<xsl:template name="QuantityQualifier">
|
||||
</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:when test="$UoM = 'PCE'">12</xsl:when>
|
||||
<xsl:otherwise>999</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
||||
Reference in New Issue
Block a user