0

XSLT : Cummulative Sum (Conditional) as 'base'で回答を使用して、別の xml で合計を計算しましたが、正しい合計が得られません。

出力は、ルート/アイテム/結果/Sku 内の 'skus' に対してのみ作成する必要があります。累積合計は、ルート/プロバイダー/結果/

合計内の述語条件が間違っていると確信しています。しかし、私は問題を理解することができません。助けていただければ幸いです。ありがとう!

サンプル XML:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Items>
        <Result>
            <Sku>XYZ</Sku>
        </Result>
        <Result>
            <Sku>ABC</Sku>
        </Result>
    </Items>
    <Providers>
        <Result>
            <ProviderCode>1_M</ProviderCode>
            <Quality>Main</Quality>
        </Result>
        <Result>
            <ProviderCode>1_D</ProviderCode>
            <Quality>Damaged</Quality>
        </Result>
        <Result>
            <ProviderCode>2_M</ProviderCode>
            <Quality>Main</Quality>
        </Result>
        <Result>
            <ProviderCode>2_D</ProviderCode>
            <Quality>Damaged</Quality>
        </Result>
    </Providers>
    <Message>
        <Body>
            <Inventory>
                <SKU>
                    <SKU>AXYZ</SKU>
                    <Description>XYZ Description</Description>
                    <Providers>
                        <Provider>
                            <ProviderCode>1_M</ProviderCode>
                            <Qty>100</Qty>
                        </Provider>
                        <Provider>
                            <ProviderCode>2_M</ProviderCode>
                            <Qty>67</Qty>
                        </Provider>
                        <Provider>
                            <ProviderCode>2_D</ProviderCode>
                            <Qty>75</Qty>
                        </Provider>                        
                        <Provider>
                            <ProviderCode>3_M</ProviderCode>
                            <Qty>74</Qty>
                        </Provider>
                        <Provider>
                            <ProviderCode>4</ProviderCode>
                            <Qty>62</Qty>
                        </Provider>    
                    </Providers>
                </SKU>
                <SKU>
                    <SKU>ABC</SKU>
                    <Description>ABC Description</Description>
                    <Providers>
                        <Provider>
                            <ProviderCode>1_M</ProviderCode>
                            <Qty>20</Qty>
                        </Provider>
                        <Provider>
                            <ProviderCode>1_D</ProviderCode>
                            <Qty>205</Qty>
                        </Provider>
                        <Provider>
                            <ProviderCode>2_M</ProviderCode>
                            <Qty>77</Qty>
                        </Provider>
                        <Provider>
                            <ProviderCode>2_D</ProviderCode>
                            <Qty>5</Qty>
                        </Provider>                        
                        <Provider>
                            <ProviderCode>3_M</ProviderCode>
                            <Qty>42</Qty>
                        </Provider>    
                        <Provider>
                            <ProviderCode>4_M</ProviderCode>
                            <Qty>631</Qty>
                        </Provider>    
                    </Providers>
                </SKU>    
            </Inventory>
        </Body>
    </Message>
</Root>

使用される XSLT:

    <xsl:output  method="xml" indent="yes"/>
    <xsl:key name="validProviders" match="/Root/Providers/Result" use="ProviderCode"/>
    <xsl:key name="validProviderQuality" match="/Root/Providers/Result" use="Quality"/>
    <xsl:key name="inboundSkus" match="/Root/Message/Body/Inventory/SKU" use="SKU"/>

    <xsl:template match="/">
        <Root>
            <xsl:apply-templates select="/Root/Items/Result"/>
        </Root>
    </xsl:template>

    <xsl:template match="/Root/Items/Result">
        <xsl:if test="key('inboundSkus',Sku)">
            <SKU>
                <xsl:variable name="Sku" select="Sku"/>
                <xsl:for-each select="/Root/Providers/Result[generate-id(.)=generate-id(key('validProviderQuality',Quality)[1])]">
                    <Record>
                        <xsl:variable name="ProviderQuality" select="Quality" />
                        <xsl:element name="Sku"><xsl:value-of select="$Sku"/></xsl:element>
                        <xsl:element name="Quality"><xsl:value-of select="$ProviderQuality"/></xsl:element>
                        <xsl:element name="Qty1"><xsl:value-of select="sum(/Root/Message/Body/Inventory/SKU[SKU=$Sku]/Providers/Provider[ProviderCode=/Root/Providers/Result[Quality=$ProviderQuality]]/Qty)"/></xsl:element>
                        <xsl:element name="Qty2"><xsl:value-of select="sum(/Root/Message/Body/Inventory/SKU[SKU=$Sku]/Providers/Provider[key('validProviderQuality',$ProviderQuality)]/Qty)"/></xsl:element>
                    </Record>                        
                </xsl:for-each>
            </SKU>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

出力:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <SKU>
        <Record>
            <Sku>ABC</Sku>
            <Quality>Main</Quality>
            <Qty1>0</Qty1>
            <Qty2>980</Qty2>
        </Record>
        <Record>
            <Sku>ABC</Sku>
            <Quality>Damaged</Quality>
            <Qty1>0</Qty1>
            <Qty2>980</Qty2>
        </Record>
    </SKU>
</Root>

欲しい結果は

<Root>
  <SKU>
    <Record>
      <Sku>ABC</Sku>
      <Quality>Main</Quality>
      <Qty>97</Qty>
    </Record>
    <Record>
      <Sku>ABC</Sku>
      <Quality>Damaged</Quality>
      <Qty>210</Qty>
    </Record>
  </SKU>
</Root>
4

2 に答える 2