XSLT - XML中每个元素中每个属性的总和与for-each?

时间:2011-09-19 08:17:34

标签: xml xslt xpath foreach nested-loops

我是整个XSLT的新手,我已经尝试通过几个论坛查找了,但我仍然没有找到问题的实际解决方案。

我有以下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 个答案:

答案 0 :(得分: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将选择document元素   node是根节点的子节点); div // para是缩写   div / descendant-or-self :: node()/ child :: para等将选择所有para   div孩子的后代。

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