3

次の XML 気象センサー構造を使用しています。当面の目標は、この構造を、最初にセンサーの位置で、次に読み取りラベルで並べ替えることです。私は 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>

OK、上は XLM で、下は XSL 変換ファイルを作成するための最善の試みです。結果の出力を入力ファイルとまったく同じ XML 形式にする必要がありますが、センサーの「場所」と「ラベル」の読み方で AZ 順で並べ替えます。多くの読書とGoogle検索の後、これが私が思いついたものです:

<?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>

Microsoft XML エディターを使用してコードをテストしています。まず、出力は入力ファイルの XML 構造を持っていないようで、完全ではありません。レベル以上のセンサーの位置やその他の項目がありません。

私は何を間違っていますか?

ところで、これを理解したら、従来の ASP で XSL 変換ファイルを使用して完全な XML ファイルを処理します。もちろん、並べ替えプロセスを除いて、そのほとんどはすでに機能しています。

4

2 に答える 2

1

恒等変換から始めて、並べ替えたい要素の親をオーバーライドします。in を使用sortxsl:apply-templatesて並べ替えることができます。

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>

XSLT1.0

<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>

XML 出力

<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>
于 2013-06-18T15:55:52.437 に答える
1

次のようなことを試してください:

<?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>
于 2013-06-18T15:57:28.997 に答える