ThomasM: XSLT-SUM

Beitrag lesen

Hallo Julian,

Wie kann ich den Wert unter "ItemDeliveryInformation.DeliveredQuantity" summieren, wenn die LineNumDeliveryNote, PackingSlipId und DeliveryDate ident sind? Weiters sollen anschließend die Nodes, welche für die Berechnung verwendet wurden entfernt werden:

Wie bereits gesagt, wird hier Gruppierung benötigt. Die Spezifik der drei identischen Kriterien bekommt man durch Zusammenführung der jeweiligen Inhalte mittels concat() in den Griff. Der Schlüssel (hier group) ist also ein zusammengefasster String, auf den sich wiederum Bezug nehmen lässt.

Probiere es so:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:key name="group" match="ItemDeliveryInformation" use="concat(LineNumDeliveryNote, PackingSlipId, DeliveryDate)"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ItemDeliveryInformation">
    <xsl:for-each select=".[generate-id() = generate-id(key('group', concat(LineNumDeliveryNote, PackingSlipId, DeliveryDate))[1])]">
      <ItemDeliveryInformation>
        <xsl:copy-of select="LineNumDeliveryNote"/>
        <xsl:copy-of select="PackingSlipId"/>
        <xsl:copy-of select="DeliveryDate"/>
        <DeliveredQuantity>
          <xsl:value-of select="format-number(sum(key('group', concat(LineNumDeliveryNote, PackingSlipId, DeliveryDate))/DeliveredQuantity), '#.00')"/>
        </DeliveredQuantity>
      </ItemDeliveryInformation>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

Grüße,
Thomas