【问题标题】:XSLT - Sum of each attribute in every element in XML with for-each?XSLT - XML中每个元素中每个属性的总和与for-each?
【发布时间】:2011-11-20 01:14:01
【问题描述】:

我是 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 不接受我实际上习惯的可变变量(过程编程)。

有没有人可以为我解决这个问题的简单方法?提前致谢!

【问题讨论】:

    标签: xml xslt xpath foreach nested-loops


    【解决方案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 将选择文档元素,因为文档元素 node 是根节点的子节点); div//para 的缩写 div/descendant-or-self::node()/child::para 等会选择所有 para div 孩子的后代。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多