XSL如何根据元素的属性对计算的元素值求和?

时间:2013-06-02 22:45:55

标签: xml xslt sum

我想根据元素的属性计算不同的值,然后将计算出的值相加。

xml结构如下所示:

<elements>
     <element type="type1">
      <value>10</value>
      <date>01.05.2012</date>
     </element>

     <element type="type2">
      <value>20</value>
      <date>02.03.2012</date>
     </element>

     <element type="type2">
      <value>20</value>
      <date>02.03.2012</date>
     </element>

</elements>

我在XSD中使用xsd:alternatives来创建不同的“类型”元素。

XSL看起来像这样:

   <xsl:for-each select="/elements">        
    <xsl:sort select="date"/> 

    <xsl:choose>
     <xsl:when test="type='type1'">
      <xsl:value-of select="value*20"/>
      <xsl:value-of select="date"/>
     </xsl:when>

     <xsl:when test="type='type1'">
      <xsl:value-of select="value*10"/>
      <xsl:value-of select="date"/>
     </xsl:when>
   </xsl:choose>

  (Here should be a sum of all the values that have been calculated.)        
  </xsl:for-each>

我希望能够在计算后显示该值(因子取决于它的“类型”。),按日期对不同的值进行排序,并显示所有计算值的总和。

我相信有更好的方法可以做我想做的事情,我对任何建议感到高兴。

1 个答案:

答案 0 :(得分:1)

假设@type="type1" should be multiplied by 10 and @ type =“type2”`应该乘以20,以下样式表:

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

    <xsl:template match="/">
        <xsl:apply-templates select="elements/element">
            <xsl:sort select="date" />
        </xsl:apply-templates>
        <xsl:value-of select="'&#xA;'"/>
        <xsl:value-of select="sum(*/element[@type='type1']/value
                                       [number()=number()]) * 10 + 
                              sum(*/element[@type='type2']/value
                                       [number()=number()]) * 20"/>
    </xsl:template>

    <xsl:template match="element[@type='type1']/value">
        <xsl:value-of select=". * 10"/>
    </xsl:template>

    <xsl:template match="element[@type='type2']/value">
        <xsl:value-of select=". * 20"/>
    </xsl:template>

    <!-- this matches any of the value elements who's values are not a number -->
    <xsl:template match="element[@type]/value[number()!=number()]">
        <xsl:text>0</xsl:text>
    </xsl:template>

</xsl:stylesheet>

产生以下输出:

    100
    01.05.2012

    400
    02.03.2012

    400
    02.03.2012

900