XSLT:累计和(条件)

时间:2013-07-05 17:38:05

标签: xslt

我需要使用XSLT进行条件求和。应仅为“提供者”节点中列出的提供者计算每个“SKU”的“Oty”总和。在提供的示例中,应跳过提供者代码4的数量,因为它不在“提供者”列表中。我只能使用XSLT 1.0。

我将不胜感激任何帮助。谢谢!

以下是XML示例。

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Providers>
        <ProviderCode>1</ProviderCode>
        <ProviderCode>2</ProviderCode>
        <ProviderCode>3</ProviderCode>        
    </Providers>
    <SKU>
        <SKU>XYZ</SKU>
        <Description>XYZ Description</Description>
        <Provider>
            <ProviderCode>1</ProviderCode>
            <Qty>100</Qty>
        </Provider>
        <Provider>
            <ProviderCode>2</ProviderCode>
            <Qty>67</Qty>
        </Provider>
        <Provider>
            <ProviderCode>3</ProviderCode>
            <Qty>74</Qty>
        </Provider>
        <Provider>
            <ProviderCode>4</ProviderCode>
            <Qty>62</Qty>
        </Provider>    
    </SKU>
    <SKU>
        <SKU>ABC</SKU>
        <Description>ABC Description</Description>
        <Provider>
            <ProviderCode>1</ProviderCode>
            <Qty>20</Qty>
        </Provider>
        <Provider>
            <ProviderCode>2</ProviderCode>
            <Qty>77</Qty>
        </Provider>
        <Provider>
            <ProviderCode>3</ProviderCode>
            <Qty>42</Qty>
        </Provider>    
        <Provider>
            <ProviderCode>4</ProviderCode>
            <Qty>631</Qty>
        </Provider>    
    </SKU>    
</Root>

这是必需的输出。

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <SKU>
        <SKU>XYZ</SKU>
        <Qty>241</Qty>
    </SKU>
    <SKU>
        <SKU>ABC</SKU>
        <Qty>139</Qty>
    </SKU>    
</Root>

1 个答案:

答案 0 :(得分:3)

您可以在所需的节点上使用sum,方法是比较sum(Provider[ProviderCode = //Providers/ProviderCode]/Qty)或使用密钥:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:key name="prov" match="Providers/ProviderCode" use="."/>

<xsl:template match="Root">
  <xsl:copy>
    <xsl:apply-templates select="SKU"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Root/SKU">
  <xsl:copy>
    <xsl:copy-of select="SKU"/>
    <Qty><xsl:value-of select="sum(Provider[key('prov', ProviderCode)]/Qty)"/></Qty>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>