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
Xslt 如何在XSL中使用总和和平均值?_Xslt_Xslt 1.0 - Fatal编程技术网

Xslt 如何在XSL中使用总和和平均值?

Xslt 如何在XSL中使用总和和平均值?,xslt,xslt-1.0,Xslt,Xslt 1.0,我想计算每辆车的总公里数和平均每天公里数 这是输入XML: <?xml version="1.0" encoding="ISO-8859-1" ?> <output> <cars> <car> <id>1</id> <brand>BMW</brand> <type>M3</type>

我想计算每辆车的总公里数和平均每天公里数

这是输入XML:

 <?xml version="1.0" encoding="ISO-8859-1" ?>   

 <output>   
<cars>  
   <car>    
      <id>1</id>    
      <brand>BMW</brand>    
      <type>M3</type>   
      <license>AD-9999-ATSR</license>   
   </car>   
<car>   
     <id>2</id> 
     <brand>Volkwagen</brand>   
     <type>GTI</type>   
     <license>ASD-7458-WERT</license>   
     </car> 
 </cars>    
 <distances>    
  <distance>    
    <id_car>1</id_car>  
    <date>20120118</date>   
    <distance>90</distance> 
</distance> 
 <distance> 
  <id_car>1</id_car>    
  <date>20120117</date> 
  <distance>23</distance>   
  </distance>
 <distance> 
  <id_car>1</id_car>    
  <date>20120117</date> 
  <distance>17</distance>   
  </distance>
<distance>  
  <id_car>1</id_car>    
 <date>20120116</date>  
 <distance>5</distance> 
 </distance>    
 <distance> 
 <id_car>2</id_car> 
<date>20120101</date>   
 <distance>92</distance>    
</distance> 
 <distance> 
 <id_car>2</id_car> 
 <date>20120102</date>  
 <distance>87</distance>    
 </distance>
 <distance> 
 <id_car>2</id_car> 
 <date>20120102</date>  
 <distance>13</distance>    
 </distance>    
<distance>  
 <id_car>2</id_car> 
 <date>20120103</date>  
 <distance>112</distance>   
  </distance>   
 </distances>   
</output>   

1.
宝马
M3
AD-9999-ATSR
2.
伏尔克瓦根
GTI
ASD-7458-WERT
1.
20120118
90
1.
20120117
23
1.
20120117
17
1.
20120116
5.
2.
20120101
92
2.
20120102
87
2.
20120102
13
2.
20120103
112
这是输出xml:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output>
<cars>
<car>
  <id>1</id>
  <brand>BMW</brand>
  <type>M3</type>
  <license>AD-9999-ATSR</license>
    <distance Total_kM="135"></distance>
    <distance average_KM/day="18/90"></distance>
    <distance average_KM/day="17/20"></distance>
    <distance average_KM/day="16/5"></distance>
</car>
<car>
  <id>2</id>
  <brand>Volkwagen</brand>
  <type>GTI</type>
  <license>ASD-7458-WERT</license>
    <distance Total_kM="304"></distance>
    <distance averageKM/day="01/90"></distance>
    <distance average_KM/day="02/50"></distance>
    <distance average_KM/day="03/112"></distance>
</car>
</cars>
</output>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="distances" match="distance" use="id_car" />

    <xsl:template match="output">
        <xsl:apply-templates select="cars" />
    </xsl:template>

    <xsl:template match="car">
        <xsl:copy>
            <xsl:apply-templates />
            <distances>
                <xsl:apply-templates select="key('distances', id)" />
            </distances>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="distance">
        <distance day="{date}">
            <xsl:value-of select="distance" />
        </distance>
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

1.
宝马
M3
AD-9999-ATSR
2.
伏尔克瓦根
GTI
ASD-7458-WERT
在输出中,你可以想到这样或那样的安排,以显示每辆车的总公里数和平均每天公里数

这是我试图更改的xsl:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output>
<cars>
<car>
  <id>1</id>
  <brand>BMW</brand>
  <type>M3</type>
  <license>AD-9999-ATSR</license>
    <distance Total_kM="135"></distance>
    <distance average_KM/day="18/90"></distance>
    <distance average_KM/day="17/20"></distance>
    <distance average_KM/day="16/5"></distance>
</car>
<car>
  <id>2</id>
  <brand>Volkwagen</brand>
  <type>GTI</type>
  <license>ASD-7458-WERT</license>
    <distance Total_kM="304"></distance>
    <distance averageKM/day="01/90"></distance>
    <distance average_KM/day="02/50"></distance>
    <distance average_KM/day="03/112"></distance>
</car>
</cars>
</output>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="distances" match="distance" use="id_car" />

    <xsl:template match="output">
        <xsl:apply-templates select="cars" />
    </xsl:template>

    <xsl:template match="car">
        <xsl:copy>
            <xsl:apply-templates />
            <distances>
                <xsl:apply-templates select="key('distances', id)" />
            </distances>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="distance">
        <distance day="{date}">
            <xsl:value-of select="distance" />
        </distance>
    </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

如何在XSL中使用求和和和平均值输出所需内容


感谢您的时间和努力

以下样式表产生了所需的结果:

<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="byCarId" match="distance" use="id_car"/>
    <xsl:key name="byCarIdAndDate" match="distance" 
             use="concat(id_car, '|', date)"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="car">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <distance Total_kM="{sum(key('byCarId', id)/distance)}"/>
            <xsl:apply-templates select="key('byCarId', id)"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template
        match="distance[generate-id()=
                        generate-id(key('byCarIdAndDate', 
                                        concat(id_car, '|', date))[1])]">
        <xsl:variable name="thisDate"
            select="key('byCarIdAndDate', concat(id_car, '|', date))"/>
        <xsl:variable name="sum" select="sum($thisDate/distance)"/>
        <xsl:variable name="count" select="count($thisDate)"/>
        <distance average_KM_day="{substring(date, 7, 2)}/{$sum div $count}"/>
    </xsl:template>
    <xsl:template match="distances|distance"/>
</xsl:stylesheet>

说明

  • 标识转换输出源中显示的每个
    car
    元素的大部分
  • 使用两个单独的键:1)根据每辆车的ID进行分组,2)根据车辆ID和日期组合进行分组
  • 只需要一个额外的模板来获取每个可能的汽车ID和日期对的第一个
    距离
    ,我们在其中输出该组合的平均值