2012-10-16 89 views
0

我使用遞歸函數來計算每個發票和每個客戶端的計算列(價格*數量)的總和。現在我需要計算每個客戶的所有發票和所有客戶的所有發票的總額。如何使用遞歸函數計算總和

XML看起來是這樣的:

<cinvoices> 
     <client> (with information @ client) </client> 
      <invoices> 
       <products> 
        <product> (information @ product: name, type ect and.. 
         <price>123</price> 
         <quantity>21</quantity> 
        </product> 
        <product> (information @ product: name, type ect and.. 
         <price>123</price> 
         <quantity>11</quantity> 
        </product> 
       </products> 
      <invoices> 
       <products> 
        <product> (information @ product: name, type ect and.. 
        <price>32</price> 
        <quantity>3</quantity> 
       </product> 
       <product> (information @ product: name, type ect and.. 
        <price>12</price> 
        <quantity>9</quantity> 
       </product> 
      </products> 
     </invoices> 
    </client> 
    <client> 

     <same as above> 
    </client> 
    </cinvoices> 

在XSLT使用的功能是:

<xsl:template name="sumProducts"> 
     <xsl:param name="pList"/> 
     <xsl:param name="pRunningTotal" select="0"/>   
     <xsl:choose> 
      <xsl:when test="$pList"> 
       <xsl:variable name="varMapPath" select="$pList[1]"/> 
       <xsl:call-template name="sumProducts"> 
        <xsl:with-param name="pList" select="$pList[position() > 1]"/> 
        <xsl:with-param name="pRunningTotal" 
        select="$pRunningTotal + $varMapPath/price * $varMapPath/quantity"/>      
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       $<xsl:value-of select="format-number($pRunningTotal, '#,##0.00')"/> 

      </xsl:otherwise> 

     </xsl:choose> 
       </xsl:template> 

==================== = 函數調用如下:

不知道如何使用此功能來計算總髮票爲每個客戶端和GRA總共爲所有客戶和所有發票。

謝謝。

回答

1

讓我先說一下你的要求。

下面的模板:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template name="sumProducts"> 
     <xsl:param name="pList"/> 
     <xsl:param name="pRunningTotal" select="0"/> 
     <xsl:choose> 
      <xsl:when test="$pList"> 
       <xsl:variable name="varMapPath" select="$pList[1]"/> 
       <xsl:call-template name="sumProducts"> 
        <xsl:with-param name="pList" select="$pList[position() > 1]"/> 
        <xsl:with-param name="pRunningTotal" select="$pRunningTotal + $varMapPath/price * $varMapPath/quantity"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       $<xsl:value-of select="format-number($pRunningTotal, '#,##0.00')"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
    <xsl:template match="/cinvoices/client/invoices"> 
     <xsl:call-template name="sumProducts"> 
      <xsl:with-param name="pList" select="*/*"/> 
     </xsl:call-template> 
    </xsl:template> 
</xsl:stylesheet> 

應用於以下XML文件:

<cinvoices> 
    <client> 
     <invoices> 
      <products> 
       <product> 
        <price>123</price> 
        <quantity>21</quantity> 
       </product> 
       <product> 
        <price>123</price> 
        <quantity>11</quantity> 
       </product> 
      </products> 
     </invoices> 
     <invoices> 
      <products> 
       <product> 
        <price>32</price> 
        <quantity>3</quantity> 
       </product> 
       <product> 
        <price>12</price> 
        <quantity>9</quantity> 
       </product> 
      </products> 
     </invoices> 
    </client> 
    <client> 
     <invoices> 
      <products> 
       <product> 
        <price>100</price> 
        <quantity>2</quantity> 
       </product> 
       <product> 
        <price>10</price> 
        <quantity>1</quantity> 
       </product> 
      </products> 
     </invoices> 
    </client> 
</cinvoices> 

應該產生以下輸出:

<?xml version="1.0" encoding="UTF-8"?> 
      $3,936.00 
      $204.00 
      $210.00 

因此,這些都是每張發票值。

您的解決方案使用XSLT命名模板。這個問題可能使用不同的技術解決,但我會堅持你已有的想法。

現在,修改最後一個模板用下面的代碼:

<xsl:template match="/cinvoices/client"> 
    <xsl:call-template name="sumProducts"> 
     <xsl:with-param name="pList" select="*/*/*"/> 
    </xsl:call-template> 
</xsl:template> 

您將獲得:

<?xml version="1.0" encoding="UTF-8"?> 
       $4,140.00 
       $210.00 

這些是每個客戶端的所有發票的總額。

現在,修改最後一個模板,此代碼:

<xsl:template match="/cinvoices"> 
    <xsl:call-template name="sumProducts"> 
     <xsl:with-param name="pList" select="*/*/*/*"/> 
    </xsl:call-template> 
</xsl:template> 

,你會得到總的所有客戶端:

<?xml version="1.0" encoding="UTF-8"?> 
       $4,350.00 
+0

謝謝盧卡斯爲您的時間。我已經找到了使用相同原理的解決方案。它解決了問題! –

+0

@FloreDraw很棒,所以現在你應該粘貼並接受你的解決方案,或者簡單地接受我的:) – Lukasz

+0

通過使用這個模板,如何計算每個客戶類型(客戶有A型或B型或C型)的平均值。同樣使用相同的模板如何計算每個類別的6個頂級發票和最高和最低發票。謝謝 –