总和问题,xslt 1.0

时间:2014-05-25 20:06:54

标签: xml sum xslt-1.0

我一直在尝试获取用户在产品上花费的总金额,但没有成功。   鉴于以下XML示例,客户端1 花费的总金额为21,00,但我得到10,50(这只有在客户购买相同产品多次,如果他购买不同的产品,返回金额是预期的)

XML示例:

<root>
            <sale id="1">
                <date>2014-01-01</date>
                <client>1</client>
            </sale>

            <sale id="2">
                <date>2014-01-02</date>
                <client>1</client>
            </sale>

            <sale_details saleID="1">
                <product id="1"/>
            </sale_details>

            <sale_details saleID="2">
                <product id="1"/>
            </sale_details>

            <product_details productID="1">
                <name>product x</name>
                <price>10.50</price>
            </product_details>

            <product_details productID="2">
                <name>product x</name>
                <price>5.26</price>
            </product_details>

            <client_detail clientID="1">
                <name>client 1</name>
            </client_detail>

            <client_detail clientID="2">
                <name>client 2</name>
            </client_detail>
    </root>

XSLT示例:

<xsl:template name="sum-spent-amount">
    <xsl:param name="clientID"/>
    <xsl:value-of select="sum(//gv:product_details[@productID=//gv:sale_details[@saleID=//gv:sale[gv:client=$clientID]/@id]/gv:product/@id]/gv:price)"/>
</xsl:template>

提前致谢!

2 个答案:

答案 0 :(得分:0)

当然,您获得10.5的结果:您正在总结已售产品的唯一实例。您必须将实际销售的价格相加。这是一种方法:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:param name="clientID" select="1"/>

<xsl:key name="sale-by-clientID" match="sale" use="client" />
<xsl:key name="sale_detail-by-saleID" match="sale_details" use="@saleID" />
<xsl:key name="product-by-id" match="product_details" use="@productID" />

<xsl:template match="/">
    <xsl:variable name="mySaleIDs" select="key('sale-by-clientID', $clientID)/@id" />
    <xsl:variable name="prices">
        <xsl:for-each select="key('sale_detail-by-saleID', $mySaleIDs)">
            <price><xsl:value-of select="key('product-by-id', product/@id)/price"/></price>
        </xsl:for-each>
    </xsl:variable>

    <sum><xsl:value-of select="sum(exsl:node-set($prices)/price)"/></sum>
</xsl:template>

</xsl:stylesheet>

当这个应用于您的输入时,结果是:

<?xml version="1.0" encoding="UTF-8"?>
<sum>21</sum>

答案 1 :(得分:0)

我使用递归模板获得此解决方案:

模板:

<xsl:template name="sum">

    <xsl:param name="nodes"/>
    <xsl:param name="total" select="0"/>

    <xsl:variable name="current" select="$nodes[1]" />
    <xsl:choose>
        <xsl:when test="$current">              
            <xsl:variable name="product" select="//gv:product_details[@productID=$current/gv:product/@id]"/>
            <xsl:call-template name="sum">

                <xsl:with-param name="nodes" select="$nodes[position() &gt; 1]"/>
                <xsl:with-param name="total" select="$total + $product/gv:price"/>

            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise><xsl:value-of select="$total"/></xsl:otherwise>
    </xsl:choose>

</xsl:template>

在此处使用模板:

<xsl:variable name="clientID" select="1"/>
<xsl:call-template name="sum">
    <xsl:with-param name="nodes" select="//gv:sale_details[@saleID=//gv:sale[gv:client=clientID]/@id]" />
</xsl:call-template>