【问题标题】:Having sum problems, xslt 1.0有求和问题,xslt 1.0
【发布时间】:2014-05-25 20:06:53
【问题描述】:

我一直在尝试获取用户在产品上花费的总金额,但没有成功。 鉴于以下 XML 示例,client 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>

提前致谢!

【问题讨论】:

    标签: xml sum xslt-1.0


    【解决方案1】:

    当然,您会得到 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>
    

    【讨论】:

    • 嘿@michael.hor257k,感谢您的快速答复。如果没有 exsl,这可能实现吗?
    • @vitor 可能,但为什么呢?我不知道任何不支持 exsl:node-set() 的 XSLT 1.0 处理器。
    • 我已经读过这方面的内容,但这是针对大学项目的,我必须使用所教的内容,我一直在尝试,但找不到正确的解决方案。
    • @vitor 要在纯 XSLT 1.0 中执行此操作,您必须使用递归模板并遍历与给定客户端 ID 关联的 sale_details。让这些中的每一个从相关产品中获取相关价格,并将其添加到结果中。
    • 感谢算法的描述!我会尝试更多地了解递归模板。
    【解决方案2】:

    我使用递归模板得到了这个解决方案:

    模板:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多