長年の読者、初めてのポスターはこちら。私は通常、サイトの他の投稿からかなり多くの情報を得ることができますが、この特定の問題の解決策を見つけることができません。$grandtotal
xsltを使用して、現在、各クライアント請求書の小計を表示してから、以下の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:
- クライアントID:2、請求書番号:3、請求書の合計:$ 1741、タイプ:政府
- クライアントID:1、請求書番号:2、請求書の合計:$ 796、タイプ:コマーシャル
- クライアントID:1、請求書番号:1、請求書の合計:497ドル、タイプ:コマーシャル
過去に私はforループを使用して<xsl:for-each select=...>
<xsl:sort select="Total" data-type="number" order="descending"/>
トップ<xsl:if test="position()<6">
5を表示しましたが、これは保存された値を調べています。別の解決策が必要になります。
私はまだマークアップに慣れていないので、この時点でいくつかのヒントが必要です!