Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSL如何对根据元素属性计算的元素值求和?_Xml_Xslt_Sum - Fatal编程技术网

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

Xml XSL如何对根据元素属性计算的元素值求和?,xml,xslt,sum,Xml,Xslt,Sum,我希望根据元素的属性计算不同的值,然后对计算出的值求和 xml结构如下所示: <elements> <element type="type1"> <value>10</value> <date>01.05.2012</date> </element> <element type="type2"> <value>20<

我希望根据元素的属性计算不同的值,然后对计算出的值求和

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>
   <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>
我希望能够在计算后显示值(根据“类型”使用系数),按日期对不同的值进行排序,并显示所有计算值的总和

我相信有更好的方法来做我想做的事情,我很高兴有任何建议

假设
@type=“type1”应乘以10,
@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>

类型1和类型2的乘法因子是多少?您的示例显示了对type1的测试和对不同值的乘法。非常感谢您的回答。我仍然存在空值生成NaN的问题。我该如何应对?我已经尝试在每个求和中的xpath之后使用[number(.)=number(.)],但它不起作用。我已经调整了答案,以适应
value
元素的空值和非数值。您可以定义一个与这些
元素匹配的模板,并发出一个
0
,在总和中,使用谓词过滤器排除那些
元素。再次感谢您。很抱歉,我刚才回答了,但前一周我几乎没有时间。我还有一个问题。如果其中一种类型不存在,您如何处理?
    100
    01.05.2012

    400
    02.03.2012

    400
    02.03.2012

900