XSLT中类似元素的总和

时间:2016-05-13 08:57:09

标签: xml xslt-2.0

我输入xml为:

 <root>
<SalesOrderLine>
<Item><ID>1056365</ID></Item>
<Quantity>1.00</Quantity>
<UnitPrice><UnitAmount>4.4</UnitAmount></UnitPrice>
</SalesOrderLine>
<SalesOrderLine>
<Item><ID>1056365</ID></Item>
<Quantity>1.00</Quantity>
<UnitPrice><UnitAmount>8.4</UnitAmount></UnitPrice>
</SalesOrderLine>
<SalesOrderLine>
<Item><ID>1056366</ID></Item>
<Quantity>1.00</Quantity>
<UnitPrice><UnitAmount>0.00</UnitAmount></UnitPrice>
</SalesOrderLine>
</root>

预期的输出xml是:

<root1>
<SL>
<Item><ID>1056365</ID></Item>
<Quantity>2.00</Quantity>
<UnitPrice><UnitAmount>6.4</UnitAmount></UnitPrice>
</SL>
<SL>
<Item><ID>1056366</ID></Item>
<Quantity>1.00</Quantity>
<UnitPrice><UnitAmount>0.00</UnitAmount></UnitPrice>
</SL>
</root>

行数量=总和(具有相同项目ID的行数量) 行数=总和(行数*行价)/总和(具有相同项目ID的行数)

有人可以建议如何使用XSLT吗?

1 个答案:

答案 0 :(得分:0)

我相信这是你正在寻找的XSL。它使用for-each-groups中的变量来计算每个销售订单行的实际总数(即其数量乘以其单位价格)。然后将该变量求和并除以数量总和,以正确计算总体单价。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
    <root1>
        <xsl:for-each-group select="SalesOrderLine" group-by="Item/ID">
            <xsl:variable name="QuantitySum" select="sum(current-group()/Quantity)"/>
            <xsl:variable name="SLTotals">
                <xsl:for-each select="current-group()">
                    <SLTotal><xsl:value-of select="Quantity * UnitPrice/UnitAmount"/></SLTotal>
                </xsl:for-each>
            </xsl:variable>
            <SL>
                <Item>
                    <ID>
                        <xsl:value-of select="current-grouping-key()"/>
                    </ID>
                </Item>
                <Quantity>
                    <xsl:value-of select="$QuantitySum"/>
                </Quantity>
                <UnitPrice>
                    <UnitAmount>
                        <xsl:value-of select="sum($SLTotals/SLTotal) div $QuantitySum"/>
                    </UnitAmount>
                </UnitPrice>
            </SL>
        </xsl:for-each-group>
    </root1>
</xsl:template>