2013-03-17 62 views
-1

我試圖使用XSLT 2.0來總結每個Year/YearQtr的產品[Widgets]的所有單個銷售人員[VOL],並按其銷售部門進行分組。可能有多種產品類型,我只是將它留在了一種類型中,以試圖簡化代碼。XSLT 2組和總和值

  1. 我已經成功地使用的,各領YearQtr值列表中某一年,但我不能工作,如何讓顯示爲全年和YearQtr元素的不同列表SalesPerson/Performance的孩子。
  2. 我試過currentgroup(),但不能看到如何指定分組,以便我只能得到部門級別的總和,而不是每個SalesPerson。

我正在使用的XML是:

<salesteam id="Team1"> 
    <department id="dept1"> 
     <salespeople> 
      <salesperson id="98765"> 
       <performance> 
        <year id="2013"> 
         <yearqtr id="1"> 
          <yearMonth id="1"> 
           <products> 
            <widgets> 
             <vol>5</vol> 
             <val>50000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="2"> 
           <products> 
            <widgets> 
             <vol>10</vol> 
             <val>100000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="3"> 
           <products> 
            <widgets> 
             <vol>15</vol> 
             <val>150000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
         </yearqtr> 
         <yearqtr id="2"> 
          <yearMonth id="4"> 
           <products> 
            <widgets> 
             <vol>20</vol> 
             <val>200000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="5"> 
           <products> 
            <widgets> 
             <vol>25</vol> 
             <val>250000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="6"> 
           <products> 
            <widgets> 
             <vol>30</vol> 
             <val>300000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
         </yearqtr> 
        </year> 
       </performance> 
      </salesperson> 
      <salesperson id="12345"> 
       <performance> 
        <year id="2013"> 
         <yearqtr id="1"> 
          <yearMonth id="1"> 
           <products> 
            <widgets> 
             <vol>5</vol> 
             <val>50000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="2"> 
           <products> 
            <widgets> 
             <vol>10</vol> 
             <val>100000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="3"> 
           <products> 
            <widgets> 
             <vol>15</vol> 
             <val>150000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
         </yearqtr> 
         <yearqtr id="2"> 
          <yearMonth id="4"> 
           <products> 
            <widgets> 
             <vol>20</vol> 
             <val>200000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="5"> 
           <products> 
            <widgets> 
             <vol>25</vol> 
             <val>250000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
          <yearMonth id="6"> 
           <products> 
            <widgets> 
             <vol>30</vol> 
             <val>300000</val> 
            </widgets> 
           </products> 
          </yearMonth> 
         </yearqtr> 
        </year> 
       </performance> 
      </salesperson> 
     </salespeople> 
    </department> 
</salesteam> 

我想達到什麼是

<table> 
<tbody> 
<tr> 
<th>2013Q1</th> 
<th>2013Q2</th> 
<th>2013Q3</th> 
<th>2013Q4</th> 
</tr> 
<tr> 
<td>30</td> 
<td>75</td> 
<td>0</td> 
<td>0</td> 
</tr> 
</tbody> 
</table> 
+0

我不太明白爲什麼你所有的'yearqtr'都有ID 1,其中一半是'Q2'。這是一個錯誤嗎?您的示例輸出也似乎並不能說明您想如何代表獨立的銷售人員。 – JLRishe 2013-03-17 12:57:04

+0

嗨,是的。我剛剛複製粘貼的例子,對不起。我期望yearqtr = 1的yearmonth id爲1,2或3 – leejkennedy 2013-03-17 13:17:47

回答

0

你真的需要使用此分組?如果你可以安全地假設一年總共有四個季度,那麼你可以有一個總和聲明來總結給定季度和年份的所有小部件的總量,就像這樣(其中$ year是一年中的參數,而$ QTR拿着季度)

<xsl:value-of select="sum(//year[@id=$year]/yearqtr[@id=$qtr]/yearMonth/products/widgets/vol)" /> 

你可以只把這個命名模板,用QTR作爲參數,並將其命名爲四次

<xsl:call-template name="sum"><xsl:with-param name="qtr" select="1" /></xsl:call-template> 
<xsl:call-template name="sum"><xsl:with-param name="qtr" select="2" /></xsl:call-template> 
<xsl:call-template name="sum"><xsl:with-param name="qtr" select="3" /></xsl:call-template> 
<xsl:call-template name="sum"><xsl:with-param name="qtr" select="4" /></xsl:call-template> 

這可能是稍微乾淨,更有效地使用密鑰來查找特定年份和季度的小部件。

<xsl:key name="quarters" match="yearqtr" use="concat(../@id, '|', @id)"/> 

那麼你的總和成爲該

<xsl:value-of 
    select="sum(key('quarters', concat($year, '|', $qtr))/yearMonth/products/widgets/vol)"/> 

下面是在這種情況下,全XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="quarters" match="yearqtr" use="concat(../@id, '|', @id)"/> 

    <xsl:param name="year" select="2013"/> 

    <xsl:template match="/*"> 
     <table> 
     <tbody> 
      <tr> 
       <th><xsl:value-of select="$year"/>Q1</th> 
       <th><xsl:value-of select="$year"/>Q2</th> 
       <th><xsl:value-of select="$year"/>Q3</th> 
       <th><xsl:value-of select="$year"/>Q4</th> 
      </tr> 
      <tr> 
       <xsl:call-template name="sum"><xsl:with-param name="qtr" select="1" /></xsl:call-template> 
       <xsl:call-template name="sum"><xsl:with-param name="qtr" select="2" /></xsl:call-template> 
       <xsl:call-template name="sum"><xsl:with-param name="qtr" select="3" /></xsl:call-template> 
       <xsl:call-template name="sum"><xsl:with-param name="qtr" select="4" /></xsl:call-template> 
      </tr> 
     </tbody> 
     </table> 
    </xsl:template> 

    <xsl:template name="sum"> 
     <xsl:param name="qtr"/> 
     <td> 
     <xsl:value-of select="sum(key('quarters', concat($year, '|', $qtr))/yearMonth/products/widgets/vol)"/> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

如果你確實想使用,雖然分組,這裏是你會怎麼做它在XSLT2.0中

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="year" select="2013"/> 

    <xsl:template match="/*"> 
     <table> 
     <tbody> 
      <tr> 
       <xsl:for-each-group select="//year[@id=$year]/yearqtr" group-by="@id"> 
        <td><xsl:value-of select="concat($year, 'Q', current-grouping-key())" /></td> 
       </xsl:for-each-group> 
      </tr> 
      <tr> 
       <xsl:for-each-group select="//year[@id=$year]/yearqtr" group-by="@id"> 
        <td><xsl:value-of select="sum(current-group()/yearMonth/products/widgets/vol)"/></td> 
       </xsl:for-each-group> 
      </tr> 
     </tbody> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 

這隻會顯示雖然存在的宿舍,所以如果沒有yearqtr元素爲季度4,例如,只顯示宿舍1到3。

編輯:如果你有多個年,那麼假設你仍然希望他們在單獨的列,你會做像這樣的分組:

<xsl:for-each-group select="//yearqtr" group-by="concat(../@id, 'Q', @id)"> 

下面是在這種情況下,全XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/*"> 
     <table> 
     <tbody> 
      <tr> 
       <xsl:for-each-group select="//yearqtr" group-by="concat(../@id, 'Q', @id)"> 
        <td><xsl:value-of select="current-grouping-key()" /></td> 
       </xsl:for-each-group> 
      </tr> 
      <tr> 
       <xsl:for-each-group select="//yearqtr" group-by="concat(../@id, 'Q', @id)"> 
        <td><xsl:value-of select="sum(current-group()/yearMonth/products/widgets/vol)"/></td> 
       </xsl:for-each-group> 
      </tr> 
     </tbody> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Hi Tim C,謝謝。我怎麼能編輯這個應付一年以上?說我有2012年以及... – leejkennedy 2013-03-17 17:20:25

+0

澄清,有可能性能值可能包括前一年,我想在兩個可能的地方顯示。我會編輯標題代碼,如下所示:<! - language:lang-xml - > leejkennedy 2013-03-17 17:25:50

+0

I'我已經編輯了我的答案,以展示如何應對多年。 – 2013-03-17 17:38:09