2011-09-19 58 views
2

我是新來的整個XSLT的東西,我已經試過通過幾個論壇來查找它,但我仍然沒有找到我的問題的實際解決方案。XSLT - XML中每個元素中的每個屬性與for-each的和?

我有下面的XML:

<Cinema> 
    <Movie name="movie1" in="191" out="191"> 
     <Period time="16:00:00" in="20" out="20"/> 
     <Period time="18:00:00" in="71" out="70"/> 
     <Period time="20:00:00" in="100" out="101"/> 
    </Movie> 
    <Movie name="movie2" in="105" out="105"> 
     <Period time="16:00:00" in="13" out="13"/> 
     <Period time="18:00:00" in="34" out="34"/> 
     <Period time="20:00:00" in="58" out="58"/> 
    </Movie> 
    <Movie name="movie3" in="247" out="247"> 
     <Period time="16:00:00" in="57" out="57"/> 
     <Period time="18:00:00" in="75" out="72"/> 
     <Period time="20:00:00" in="115" out="118"/> 
    </Movie> 
</Cinema> 

我想獲得在每個電影期間的遊客總量。 例如:

16:00h - in: 90, out: 90 
18:00h - in: 180, out: 176 
20:00h - in: 273, out: 277 
Total - in: 543, out: 543 

我嘗試過使用嵌套每個循環,但我無法真正弄清楚如何使用它在這樣一個例子,因爲XSLT不接受改變的變量,我實際使用(程序編程)。

有沒有人對我這個問題有一個簡單的解決方案?提前致謝!

回答

1

您可以使用sum函數。

XSTL 1.0溶液:

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

    <xsl:key name="k" match="Period" use="@time"/> 

    <xsl:template match="/Cinema"> 
     <xsl:apply-templates select="//Period[generate-id(.) = generate-id(key('k', @time))]"/> 

     <xsl:value-of select="concat('Total - in: ', sum(Movie/@in), ', out: ', sum(Movie/@out))"/> 
    </xsl:template> 

    <xsl:template match="Period"> 
     <xsl:value-of select=" 
         concat(substring(@time, 1, 5), 'h - in: ', 
         sum(key('k', @time)/@in), 
         ', out: ', 
         sum(key('k', @time)/@out))"/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

輸出:

16:00h - in: 90, out: 90 
18:00h - in: 180, out: 176 
20:00h - in: 273, out: 277 
Total - in: 543, out: 543 

它使用Muenchian方法分組。參考:http://www.jenitennison.com/xslt/grouping/muenchian.html

//是/ descendant-or-self :: node()/的縮寫。例如,// para是 是/ descendant-or-self :: node()/ child :: para的縮寫,因此將選擇 文檔中的任何para元素(即使是para元素也是 文檔元素由/ para選中,因爲文檔元素 節點是根節點的子節點); div // para是 div/descendant-or-self :: node()/ child :: para的縮寫,因此將選擇所有子div的子段 的後代。

參考:http://www.w3.org/TR/xpath/#path-abbrev

相關問題