2013-02-27 105 views
1

我是XSLT的新手,並且在完成結果時遇到了麻煩,我來這裏以防萬一任何人都可以幫助我。用於分組和彙總值的XSLT

我有下面的XML:

<funds> 
    <bags> 
     <bag name="BAG_USD_MAIN" value="10.0" type="USD"> 
      <pockets> 
       <pocket name="bank" value="7.5"> 
       <pocket name="award" value="2.5"> 
      </pockets> 
     </bag> 
     <bag name="BAG_USD_SAVINGS" value="290.75" type="USD"> 
      <pockets> 
       <pocket name="bank" value="290.75"> 
      </pockets> 
     </bag> 
     <bag name="BAG_EUR_EXTRA" value="890.0" type="EUR"> 
      <pockets> 
       <pocket name="bank" value="753.0"> 
       <pocket name="bank_eng" value="137.0"> 
      </pockets> 
     </bag> 
    </bags> 
</funds> 

而且我希望能夠通過這種方式改變它:

<result> 
    <total type="USD">375.0</total> 
    <total type="EUR">890.0</total> 
</result> 

是否有可能與XSLT?

謝謝 問候 TS

+0

XSLT 1.0或2.0? – 2013-02-27 12:48:21

+0

這將是XSLT 2.0。 – 2013-02-27 12:57:32

回答

0

是。我沒有XSLT處理器很方便,但你可以試試下面的:

<result> 
    <xsl:for-each select="distinct-values(//bag/@type)"> 
    <total type="."><xsl:value-of select="sum(//bag[@type = .])"/></total> 
    </xsl:for-each> 
</result> 

對於更大量的數據,你應該考慮使用<xsl:for-each-group>代替。

+3

如果數據的數據量不重要,那麼這不僅僅是一個問題:對於每個組的解決方案可能要快得多。 – 2013-02-27 16:39:09

+0

不夠公平,+1;將相應地編輯我的帖子。 – 2013-02-27 20:18:57

2

因爲使用XSLT 2.0可以使用<的xsl:for-各個羣組>元件由@type族元素,然後使用總和()來總結的組中的元素。

下面的樣式表來解決你正在嘗試做的事:

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


    <!-- Match the bags element --> 
    <xsl:template match="bags"> 
     <result> 
      <!-- Group each bag element by its type --> 
      <xsl:for-each-group select="bag" group-by="@type"> 
       <!-- Use the current key to display the type attribute --> 
       <total type="{current-grouping-key()}"> 
        <!-- Sum all the elements from the current group --> 
        <xsl:value-of select="sum(current-group()/@value)" /> 
       </total> 
      </xsl:for-each-group> 
     </result> 
    </xsl:template> 

</xsl:stylesheet> 

只是爲了保持完整性的XSLT 1.0解決方案將基於Muenchian分組的。

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

    <!-- Index all bag elements withing bags element using their 
     type attribute by using a key --> 
    <xsl:key name="currency-key" 
      match="/funds/bags/bag" 
      use="@type" /> 

    <!-- Match bags element --> 
    <xsl:template match="bags"> 
     <result> 
      <!-- Match the first bag element for a specific group --> 
      <xsl:apply-templates select="bag[generate-id() = generate-id(key('currency-key', @type)[1])]" /> 
     </result> 
    </xsl:template> 

    <xsl:template match="bag"> 
     <total type="{@type}"> 
      <!-- Sum all the elements from the @type group --> 
      <xsl:value-of select="sum(key('currency-key', @type)/@value)" /> 
     </total> 
    </xsl:template> 

</xsl:stylesheet> 
+0

非常感謝巴勃羅。這做到了!非常感謝!!!! – 2013-02-27 16:47:53

+0

很高興能幫到;) – 2013-02-28 10:50:52