2011-09-19 59 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

相关问题