使用XSL转换对XML进行排序
我使用以下XML,天气传感器结构。当前的目标是对这种结构进行排序,首先是通过传感器位置,然后通过读取标签。我是一个努力学习XML处理的新手使用XSL转换对XML进行排序,xml,sorting,xslt,asp-classic,Xml,Sorting,Xslt,Asp Classic,我使用以下XML,天气传感器结构。当前的目标是对这种结构进行排序,首先是通过传感器位置,然后通过读取标签。我是一个努力学习XML处理的新手 <Sensors> <sensor location="House - Front Entry"> <reading label="Temperature"> <title>House - Front Entry</title>
<Sensors>
<sensor location="House - Front Entry">
<reading label="Temperature">
<title>House - Front Entry</title>
<label>Temperature</label>
<value>57</value>
<units>F</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>64</hi>
<lo>56</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>72</hi>
<lo>46</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>79</hi>
<lo>46</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>80</hi>
<lo>41</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>80</hi>
<lo>41</lo>
</record>
</records>
</reading>
<reading label="Humidity">
<title>House - Front Entry</title>
<label>Humidity</label>
<value>83</value>
<units>%</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>83</hi>
<lo>58</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>83</hi>
<lo>42</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
</records>
</reading>
</sensor>
<sensor location="House - Patio">
<reading label="Temperature">
<title>House - Patio</title>
<label>Temperature</label>
<value>53</value>
<units>F</units>
<lastUpdate>05/28/2013 09:48 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>65</hi>
<lo>51</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>71</hi>
<lo>38</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
</records>
</reading>
<reading label="Humidity">
<title>House - Patio</title>
<label>Humidity</label>
<value>98</value>
<units>%</units>
<lastUpdate>05/28/2013 09:48 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>99</hi>
<lo>47</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>99</hi>
<lo>33</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
</records>
</reading>
<reading label="Rainfall">
<title>House - Patio</title>
<label>Rainfall</label>
<value>0.22</value>
<units>in</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Previous Event">
<timeFrame>Previous Event</timeFrame>
<total>0.24</total>
<eventDate>05/22/2013</eventDate>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<total>0.22</total>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<total>6.97</total>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<total>6.97</total>
</record>
</records>
</reading>
</sensor>
<sensor location="Cabin - Kitchen">
<reading label="Temperature">
<title>Cabin - Kitchen</title>
<label>Temperature</label>
<value>57</value>
<units>F</units>
<lastUpdate>05/28/2013 11:29 AM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>63</hi>
<lo>58</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>74</hi>
<lo>58</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>74</hi>
<lo>38</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>76</hi>
<lo>30</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>76</hi>
<lo>30</lo>
</record>
</records>
</reading>
<reading label="Humidity">
<title>Cabin - Kitchen</title>
<label>Humidity</label>
<value>41</value>
<units>%</units>
<lastUpdate>05/28/2013 11:29 AM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>41</hi>
<lo>40</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>48</hi>
<lo>40</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>48</hi>
<lo>39</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>48</hi>
<lo>13</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>48</hi>
<lo>13</lo>
</record>
</records>
</reading>
</sensor>
</Sensors>
屋前入口
温度
57
F
2013年5月28日09:49
今天
64
56
周
72
46
月
79
46
年
80
41
一直
80
41
屋前入口
湿度
83
%
2013年5月28日09:49
今天
83
58
周
83
42
月
99
31
年
99
31
一直
99
31
庭院
温度
53
F
2013年5月28日晚上9:48
今天
65
51
周
71
38
月
80
38
年
80
38
一直
80
38
庭院
湿度
98
%
2013年5月28日晚上9:48
今天
99
47
周
99
33
月
99
24
年
99
24
一直
99
24
庭院
降雨量
0.22
在里面
2013年5月28日09:49
往事
0.24
05/22/2013
周
0.22
月
6.97
年
6.97
小屋-厨房
温度
57
F
2013年5月28日上午11:29
今天
63
58
周
74
58
月
74
38
年
76
30
一直
76
30
小屋-厨房
湿度
41
%
2013年5月28日上午11:29
今天
41
40
周
48
40
月
48
39
年
48
13
一直
48
13
好的,上面是XLM,下面是我创建XSL转换文件的最佳尝试。我希望结果输出为XML格式,与输入文件完全相同,但按传感器“位置”和读取“标签”按A-Z顺序排序。经过大量阅读和谷歌搜索,我发现:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Sensors">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="sensor/@location"/>
<xsl:sort select="reading/label"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我正在使用MicrosoftXML编辑器测试我的代码。首先,输出似乎没有输入文件的XML结构,而且它也不完整,缺少传感器位置和级别及以上的其他项
我做错了什么
顺便说一下,在我弄明白这一点之后,我将使用经典ASP中的XSL转换文件处理完整的XML文件。除排序过程外,大部分工作已经开始了。从一个开始,然后覆盖要排序的元素的父元素。您可以在xsl:apply templates
中使用sort
进行排序
XML输入<Sensors>
<sensor location="House - Front Entry">
<reading label="Temperature">
<title>House - Front Entry</title>
<label>Temperature</label>
<value>57</value>
<units>F</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>64</hi>
<lo>56</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>72</hi>
<lo>46</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>79</hi>
<lo>46</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>80</hi>
<lo>41</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>80</hi>
<lo>41</lo>
</record>
</records>
</reading>
<reading label="Humidity">
<title>House - Front Entry</title>
<label>Humidity</label>
<value>83</value>
<units>%</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>83</hi>
<lo>58</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>83</hi>
<lo>42</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
</records>
</reading>
</sensor>
<sensor location="House - Patio">
<reading label="Temperature">
<title>House - Patio</title>
<label>Temperature</label>
<value>53</value>
<units>F</units>
<lastUpdate>05/28/2013 09:48 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>65</hi>
<lo>51</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>71</hi>
<lo>38</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
</records>
</reading>
<reading label="Humidity">
<title>House - Patio</title>
<label>Humidity</label>
<value>98</value>
<units>%</units>
<lastUpdate>05/28/2013 09:48 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>99</hi>
<lo>47</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>99</hi>
<lo>33</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
</records>
</reading>
<reading label="Rainfall">
<title>House - Patio</title>
<label>Rainfall</label>
<value>0.22</value>
<units>in</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Previous Event">
<timeFrame>Previous Event</timeFrame>
<total>0.24</total>
<eventDate>05/22/2013</eventDate>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<total>0.22</total>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<total>6.97</total>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<total>6.97</total>
</record>
</records>
</reading>
</sensor>
<sensor location="Cabin - Kitchen">
<reading label="Temperature">
<title>Cabin - Kitchen</title>
<label>Temperature</label>
<value>57</value>
<units>F</units>
<lastUpdate>05/28/2013 11:29 AM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>63</hi>
<lo>58</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>74</hi>
<lo>58</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>74</hi>
<lo>38</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>76</hi>
<lo>30</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>76</hi>
<lo>30</lo>
</record>
</records>
</reading>
<reading label="Humidity">
<title>Cabin - Kitchen</title>
<label>Humidity</label>
<value>41</value>
<units>%</units>
<lastUpdate>05/28/2013 11:29 AM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>41</hi>
<lo>40</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>48</hi>
<lo>40</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>48</hi>
<lo>39</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>48</hi>
<lo>13</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>48</hi>
<lo>13</lo>
</record>
</records>
</reading>
</sensor>
</Sensors>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Sensors">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="@location"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="sensor">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="@label"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<Sensors>
<sensor location="Cabin - Kitchen">
<reading label="Humidity">
<title>Cabin - Kitchen</title>
<label>Humidity</label>
<value>41</value>
<units>%</units>
<lastUpdate>05/28/2013 11:29 AM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>41</hi>
<lo>40</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>48</hi>
<lo>40</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>48</hi>
<lo>39</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>48</hi>
<lo>13</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>48</hi>
<lo>13</lo>
</record>
</records>
</reading>
<reading label="Temperature">
<title>Cabin - Kitchen</title>
<label>Temperature</label>
<value>57</value>
<units>F</units>
<lastUpdate>05/28/2013 11:29 AM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>63</hi>
<lo>58</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>74</hi>
<lo>58</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>74</hi>
<lo>38</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>76</hi>
<lo>30</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>76</hi>
<lo>30</lo>
</record>
</records>
</reading>
</sensor>
<sensor location="House - Front Entry">
<reading label="Humidity">
<title>House - Front Entry</title>
<label>Humidity</label>
<value>83</value>
<units>%</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>83</hi>
<lo>58</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>83</hi>
<lo>42</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>99</hi>
<lo>31</lo>
</record>
</records>
</reading>
<reading label="Temperature">
<title>House - Front Entry</title>
<label>Temperature</label>
<value>57</value>
<units>F</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>64</hi>
<lo>56</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>72</hi>
<lo>46</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>79</hi>
<lo>46</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>80</hi>
<lo>41</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>80</hi>
<lo>41</lo>
</record>
</records>
</reading>
</sensor>
<sensor location="House - Patio">
<reading label="Humidity">
<title>House - Patio</title>
<label>Humidity</label>
<value>98</value>
<units>%</units>
<lastUpdate>05/28/2013 09:48 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>99</hi>
<lo>47</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>99</hi>
<lo>33</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>99</hi>
<lo>24</lo>
</record>
</records>
</reading>
<reading label="Rainfall">
<title>House - Patio</title>
<label>Rainfall</label>
<value>0.22</value>
<units>in</units>
<lastUpdate>05/28/2013 09:49 PM</lastUpdate>
<records>
<record timeFrame="Previous Event">
<timeFrame>Previous Event</timeFrame>
<total>0.24</total>
<eventDate>05/22/2013</eventDate>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<total>0.22</total>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<total>6.97</total>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<total>6.97</total>
</record>
</records>
</reading>
<reading label="Temperature">
<title>House - Patio</title>
<label>Temperature</label>
<value>53</value>
<units>F</units>
<lastUpdate>05/28/2013 09:48 PM</lastUpdate>
<records>
<record timeFrame="Today">
<timeFrame>Today</timeFrame>
<hi>65</hi>
<lo>51</lo>
</record>
<record timeFrame="Week">
<timeFrame>Week</timeFrame>
<hi>71</hi>
<lo>38</lo>
</record>
<record timeFrame="Month">
<timeFrame>Month</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
<record timeFrame="Year">
<timeFrame>Year</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
<record timeFrame="Alltime">
<timeFrame>Alltime</timeFrame>
<hi>80</hi>
<lo>38</lo>
</record>
</records>
</reading>
</sensor>
</Sensors>
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Sensors" >
<xsl:copy>
<xsl:apply-templates select="sensor">
<xsl:sort select="@location"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="sensor">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="reading">
<xsl:sort select="@label"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>