Hallo Julian,
Hallo,
hätte mit folg. Part versucht die Duplikate unter "ItemDeliveryInformation" zu entfernen. [...]
Jedoch muss ich weiters, das daraus entstandene Ergebnis zusammenzählen. [...]
Wie schon erwähnt, sehe ich keine native Lösung mit XSLT 1.0, aber mit einer Nodeset-Erweiterug kann es klappen, sofern der XSLT-Prozessor diese unterstützt. Habe das mal mit dem MSXML-Prozessor probiert (das M ist kein Schreibfehler). EXSLT wäre ein weiterer Ansatz.
Ziemlich wilde Umsetzung:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="packing_slip" match="ItemDeliveryInformation" use="concat(LineNumDeliveryNote, '|', PackingSlipId, '|', DeliveryDate, '|', DeliveredQuantity, '|', RecId_InventTrans)"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Item">
<Item>
<xsl:apply-templates/>
<xsl:call-template name="process1"/>
</Item>
</xsl:template>
<xsl:template match="ItemDeliveryInformation"/>
<xsl:template name="process1">
<xsl:variable name="tempdoc">
<temproot>
<xsl:for-each select="ItemDeliveryInformation[generate-id() = generate-id(key('packing_slip', concat(LineNumDeliveryNote, '|', PackingSlipId, '|', DeliveryDate, '|', DeliveredQuantity, '|', RecId_InventTrans))[1])]">
<xsl:copy-of select="."/>
</xsl:for-each>
</temproot>
</xsl:variable>
<xsl:call-template name="process2">
<xsl:with-param name="nodes" select="msxsl:node-set($tempdoc)"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="process2">
<xsl:param name="nodes"/>
<ItemDeliveryInformation>
<LineNumDeliveryNote>
<xsl:value-of select="$nodes//LineNumDeliveryNote[1]"/>
</LineNumDeliveryNote>
<PackingSlipId>
<xsl:value-of select="$nodes//PackingSlipId[1]"/>
</PackingSlipId>
<DeliveryDate>
<xsl:value-of select="$nodes//DeliveryDate[1]"/>
</DeliveryDate>
<DeliveredQuantity>
<xsl:value-of select="format-number(sum($nodes//DeliveredQuantity), '#.00')"/>
</DeliveredQuantity>
</ItemDeliveryInformation>
</xsl:template>
</xsl:stylesheet>
Mit diesem Ergebnis:
<?xml version="1.0" encoding="UTF-8"?>
<SALESINVOICE>
<Interchange>
<Interchange_Control_Number>5637372751</Interchange_Control_Number>
</Interchange>
<HeaderInformation>
<OrigInvoiceNumber>1</OrigInvoiceNumber>
</HeaderInformation>
<LineInformation>
<Item>
<LineNum>10</LineNum>
<GTIN>1234</GTIN>
<ItemDeliveryInformation>
<LineNumDeliveryNote>10</LineNumDeliveryNote>
<PackingSlipId>LS-0000224</PackingSlipId>
<DeliveryDate>2021-02-01</DeliveryDate>
<DeliveredQuantity>36.00</DeliveredQuantity>
</ItemDeliveryInformation>
</Item>
</LineInformation>
</SALESINVOICE>
Grüße,
Thomas