Xml 有求和问题,XSLT1.0

Xml 有求和问题,XSLT1.0,xml,sum,xslt-1.0,Xml,Sum,Xslt 1.0,我一直在尝试获取用户在产品上的总花费,但没有成功。 给定下面的XML示例,客户端1花费的总金额为21,00,但我得到的是10,50。只有当客户端多次购买同一产品时才会发生这种情况,如果他购买不同的产品,则返回的金额是预期的 XML示例: <root> <sale id="1"> <date>2014-01-01</date> <client>1<

我一直在尝试获取用户在产品上的总花费,但没有成功。 给定下面的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>

提前谢谢

当然,您得到的结果是10.5:您是对所销售产品的独特实例求和。你必须把实际销售的价格加起来。这里有一种方法:

XSLT1.0

将其应用于输入时,结果为:

<?xml version="1.0" encoding="UTF-8"?>
<sum>21</sum>
我使用递归模板获得了此解决方案:

<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: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>

嘿@michael.hor257k,谢谢你的快速回答。如果没有exsl,这可能实现吗?@vitor可能,但为什么?我不知道有哪个XSLT 1.0处理器不支持exsl:node set。我已经读过这方面的内容,但这是一个大学项目,我必须使用已经教过的内容,我一直在尝试,但我找不到正确的解决方案。@vitor要在纯XSLT 1.0中做到这一点,您必须使用递归模板并循环查看与给定客户id关联的销售详情。让每个模板从相关产品中获取相关价格,并将其添加到结果中。感谢您对算法的描述!我将尝试了解有关递归模板的更多信息。