2

長年の読者、初めてのポスターはこちら。私は通常、サイトの他の投稿からかなり多くの情報を得ることができますが、この特定の問題の解決策を見つけることができません。$grandtotalxsltを使用して、現在、各クライアント請求書の小計を表示してから、以下の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() &gt; 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:

  1. クライアントID:2、請求書番号:3、請求書の合計:$ 1741、タイプ:政府
  2. クライアントID:1、請求書番号:2、請求書の合計:$ 796、タイプ:コマーシャル
  3. クライアントID:1、請求書番号:1、請求書の合計:497ドル、タイプ:コマーシャル

過去に私はforループを使用して<xsl:for-each select=...> <xsl:sort select="Total" data-type="number" order="descending"/> トップ<xsl:if test="position()&lt;6"> 5を表示しましたが、これは保存された値を調べています。別の解決策が必要になります。

私はまだマークアップに慣れていないので、この時点でいくつかのヒントが必要です!

4

1 に答える 1

1

この 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="xsl exsl">
<xsl:output method="html" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="/*">
  <table>
    <th><td>Client id</td><td>Invoice no</td><td>Invoice total</td>
        <td>Type</td></th>
    <xsl:variable name="rows">
      <xsl:apply-templates select="client/inv" />
    </xsl:variable>
    <xsl:for-each select="exsl:node-set($rows)/tr">
      <xsl:sort select="td[4]" data-type="number" order="descending" />
      <xsl:variable name="rank" select="position()" />
      <xsl:copy-of select="self::node()[$rank &lt; 6]" />
    </xsl:for-each>
  </table>
</xsl:template>

<xsl:template match="inv">
  <tr>
    <td><xsl:value-of select="../clientid" /></td>
    <td><xsl:value-of select="invno" /></td>
    <xsl:variable name="gross-prices">
      <xsl:for-each select="product">
        <t><xsl:value-of select="productprice * totalqty" /></t> 
      </xsl:for-each>  
    </xsl:variable>  
    <td><xsl:value-of select="sum( exsl:node-set($gross-prices)/t)" /></td>
    <td><xsl:value-of select="../@type" /></td>
  </tr>
</xsl:template>

</xsl:stylesheet>

...この入力に適用すると...

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

...収量...

<table>
  <th>
    <td>Client id</td>
    <td>Invoice no</td>
    <td>Invoice total</td>
    <td>Type</td>
  </th>
  <tr>
    <td>2</td>
    <td>3</td>
    <td>1741</td>
    <td>Government</td>
  </tr>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>796</td>
    <td>Commercial</td>
  </tr>
  <tr>
    <td>1</td>
    <td>1</td>
    <td>497</td>
    <td>Commercial</td>
  </tr>
</table>

ノート

node-set() にアクセスできる限り、合計を計算するために折り畳んだり分割統治したりする必要はありません。ネイティブの sum() 関数を使用するだけです。

于 2012-10-23T07:36:51.390 に答える