Xml 有求和问题,XSLT1.0
我一直在尝试获取用户在产品上的总花费,但没有成功。 给定下面的XML示例,客户端1花费的总金额为21,00,但我得到的是10,50。只有当客户端多次购买同一产品时才会发生这种情况,如果他购买不同的产品,则返回的金额是预期的 XML示例: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<
<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() > 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() > 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关联的销售详情。让每个模板从相关产品中获取相关价格,并将其添加到结果中。感谢您对算法的描述!我将尝试了解有关递归模板的更多信息。