1
votes

I am working on Grouping using XSLT 1.0 but output is not as expected.

I need to sum the quantity in MovementLine for respective Movement, but instead the sum is happening for all Movement instead. Here the key should work for each Movement but not for all

Source XML :

`<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MovementFileFlowRequest>
    <Movement>
        <MovementLine>
            <ArticleNumber>355</ArticleNumber>
            <Quantity>10</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
        <MovementLine>
            <ArticleNumber>129</ArticleNumber>
            <Quantity>10</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
        <MovementLine>
            <ArticleNumber>355</ArticleNumber>
            <Quantity>50</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
    </Movement>
    <Movement>
        <MovementLine>
            <ArticleNumber>359</ArticleNumber>
            <Quantity>10</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
    </Movement>
    <Movement>
        <MovementLine>
            <ArticleNumber>359</ArticleNumber>
            <Quantity>10</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
    </Movement>
</MovementFileFlowRequest>`

XSLT :

`<?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" indent="yes"/>
    <xsl:key name="Movements" match="MovementLine" use="concat(ArticleNumber, '|', LogisticVariety, '|' , Status)"/>

    <xsl:template match="/">
        <xsl:for-each select="MovementFileFlowRequest">


        <MovementFileFlowRequest >
            <xsl:for-each select="Movement">
                <!-- Apply "group" template to the first Record Line in group -->
                <Movement>
                    <xsl:for-each select="MovementLine[generate-id() = generate-id(key('Movements', concat(ArticleNumber, '|', LogisticVariety, '|' , Status))[1])]">
                        <xsl:variable name="Quantity" select="sum(key('Movements', concat(ArticleNumber, '|', LogisticVariety, '|' , Status))/Quantity)"/>
                        <MovementLine>
                            <xsl:copy-of select="./*[not(name()='Quantity')]"/>
                            <Quantity>
                                <xsl:value-of select="$Quantity" />
                            </Quantity>    
                        </MovementLine>
                    </xsl:for-each>
                </Movement>
            </xsl:for-each>
        </MovementFileFlowRequest>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>`

Current Output :

`<?xml version="1.0" encoding="UTF-8"?>
<MovementFileFlowRequest>
<Movement>
      <MovementLine>
         <ArticleNumber>355</ArticleNumber>
         <LogisticVariety>2</LogisticVariety>
         <Status>12</Status>
         <DateFormatted>20190516</DateFormatted>
         <Content/>
         <LineReference/>
         <Quantity>60</Quantity>
      </MovementLine>
      <MovementLine>
         <ArticleNumber>129</ArticleNumber>
         <LogisticVariety>2</LogisticVariety>
         <Status>12</Status>
         <DateFormatted>20190516</DateFormatted>
         <Content/>
         <LineReference/>
         <Quantity>10</Quantity>
      </MovementLine>
   </Movement>
   <Movement>
      <MovementLine>
         <ArticleNumber>359</ArticleNumber>
         <LogisticVariety>2</LogisticVariety>
         <Status>12</Status>
         <DateFormatted>20190516</DateFormatted>
         <Content/>
         <LineReference/>
         <Quantity>20</Quantity>
      </MovementLine>
   </Movement>
   <Movement/>
</MovementFileFlowRequest>
`

Desired Output :

`<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MovementFileFlowRequest>
    <Movement>
        <MovementLine>
            <ArticleNumber>355</ArticleNumber>
            <Quantity>60</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
        <MovementLine>
            <ArticleNumber>129</ArticleNumber>
            <Quantity>10</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
    </Movement>
    <Movement>
        <MovementLine>
            <ArticleNumber>359</ArticleNumber>
            <Quantity>10</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
    </Movement>
    <Movement>
        <MovementLine>
            <ArticleNumber>359</ArticleNumber>
            <Quantity>10</Quantity>
            <LogisticVariety>2</LogisticVariety>
            <Status>12</Status>
            <DateFormatted>20190516</DateFormatted>
            <Content/>
            <LineReference/>
        </MovementLine>
    </Movement>
</MovementFileFlowRequest>`
1

1 Answers

0
votes

Change the key use or selection expression to include the generated id of the parent element e.g. use="concat(generated-id(..), '|', ArticleNumber, '|', LogisticVariety, '|' , Status)", make sure you adapt all expressions in the XSLT code where you use the key function as well to adapt the expression the same way.