ThomasM: XSLT 1.0 zwei Abfragen kombinieren

Beitrag lesen

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