长期读者,第一次在这里发布海报。我通常能够从网站上的其他帖子中获得相当多的信息,但我找不到这个特定问题的解决方案。使用 xslt,我目前能够显示每个客户发票的小计,然后通过将另一个变量添加$grandtotal
到我下面的 xslt 模板并$sum
在循环的每次迭代中添加到它来显示这些发票的总计。
我现在需要做的是找到前 5 名最高的总发票。
这是我的 XML 的缩短版本:
<bits>
<client type="Commercial">
<clientid>1</clientid>
<inv>
<invno>1</invno>
<product>
<productid>321</productid>
<productprice>99.00</productprice>
<totalqty>2</totalqty>
</product>
<product>
<productid>333</productid>
<productprice>299.00</productprice>
<totalqty>1</totalqty>
</product>
</inv>
<inv>
<invno>2</invno>
<product>
<productid>321</productid>
<productprice>99.00</productprice>
<totalqty>2</totalqty>
</product>
<product>
<productid>333</productid>
<productprice>299.00</productprice>
<totalqty>2</totalqty>
</product>
</inv>
</client>
<client type="Government">
<clientid>2</clientid>
<inv>
<invno>3</invno>
<product>
<productid>399</productid>
<productprice>1469.00</productprice>
<totalqty>1</totalqty>
</product>
<product>
<productid>354</productid>
<productprice>15.00</productprice>
<totalqty>1</totalqty>
</product>
<product>
<productid>311</productid>
<productprice>58.00</productprice>
<totalqty>1</totalqty>
</product>
<product>
<productid>341</productid>
<productprice>199.00</productprice>
<totalqty>1</totalqty>
</product>
</inv>
</client>
</bits>
我已使用以下代码对每个客户的发票总额求和:
<xsl:for-each select="//client">
<xsl:call-template name="sum">
<xsl:with-param name="nodes" select="inv/product"/>
</xsl:call-template>
</xsl:for-each>
<xsl:template name="sum">
<xsl:param name="nodes" />
<xsl:param name="sum" select="0" />
<xsl:variable name="current" select="$nodes[1]" />
<xsl:if test="$current">
<xsl:call-template name="sum">
<xsl:with-param name="nodes" select="$nodes[position() > 1]" />
<xsl:with-param name="sum" select="$sum + $current/totalqty * $current/productprice" />
</xsl:call-template>
</xsl:if>
<xsl:if test="not($current)">
<xsl:value-of select="$sum" />
</xsl:if>
我想做的是重用这段代码来显示5个最高的总和发票及其对应的<clientid>
,type
例如:
前5:
- Clientid:2,发票编号:3,发票总额:1741 美元,类型:政府
- Clientid:1,发票编号:2,发票总额:796 美元,类型:商业
- Clientid:1,发票编号:1,发票总额:497 美元,类型:商业
过去我使用 for 循环<xsl:for-each select=...>
<xsl:sort select="Total" data-type="number" order="descending"/>
...<xsl:if test="position()<6">
显示前 5 名,但这是查看存储值。我将需要另一个解决方案。
在这一点上我需要一些提示,因为我对标记还是很陌生!