Друзья, прошу вашей помощи. Есть XML вида: Код | <?xml version="1.0" ?> <MMWEATHER> <REPORT type="frc3"> <TOWN index="28722" sname="%D3%F4%E0" latitude="55" longitude="56">
<FORECAST day="5" month="11" year="2009" hour="6" tod="1" predict="12" weekday="5"> <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="757" min="755"/> <TEMPERATURE max="-4" min="-6"/> <WIND min="3" max="6" direction="0"/> <RELWET max="95" min="90"/> <HEAT min="-6" max="-4"/> </FORECAST>
<FORECAST day="5" month="11" year="2009" hour="12" tod="2" predict="18" weekday="5"> <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="758" min="756"/> <TEMPERATURE max="-2" min="-4"/> <WIND min="2" max="5" direction="0"/> <RELWET max="81" min="76"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="5" month="11" year="2009" hour="18" tod="3" predict="24" weekday="5"> <PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="759" min="757"/> <TEMPERATURE max="-1" min="-3"/> <WIND min="2" max="5" direction="0"/> <RELWET max="80" min="75"/> <HEAT min="-3" max="-1"/> </FORECAST>
<FORECAST day="6" month="11" year="2009" hour="0" tod="0" predict="30" weekday="6"> <PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="760" min="758"/> <TEMPERATURE max="-2" min="-4"/> <WIND min="2" max="5" direction="0"/> <RELWET max="90" min="85"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="6" month="11" year="2009" hour="6" tod="1" predict="36" weekday="6"> <PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="762" min="760"/> <TEMPERATURE max="-2" min="-4"/> <WIND min="2" max="5" direction="0"/> <RELWET max="88" min="83"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="6" month="11" year="2009" hour="12" tod="2" predict="42" weekday="6"> <PHENOMENA cloudiness="2" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="763" min="761"/> <TEMPERATURE max="-1" min="-3"/> <WIND min="3" max="6" direction="0"/> <RELWET max="73" min="68"/> <HEAT min="-3" max="-1"/> </FORECAST>
<FORECAST day="6" month="11" year="2009" hour="18" tod="3" predict="48" weekday="6"> <PHENOMENA cloudiness="2" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="763" min="761"/> <TEMPERATURE max="0" min="-2"/> <WIND min="3" max="6" direction="0"/> <RELWET max="74" min="69"/> <HEAT min="-2" max="0"/> </FORECAST>
<FORECAST day="7" month="11" year="2009" hour="0" tod="0" predict="54" weekday="7"> <PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="765" min="763"/> <TEMPERATURE max="-2" min="-4"/> <WIND min="2" max="5" direction="1"/> <RELWET max="87" min="82"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="7" month="11" year="2009" hour="6" tod="1" predict="60" weekday="7"> <PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="766" min="764"/> <TEMPERATURE max="-3" min="-5"/> <WIND min="2" max="5" direction="1"/> <RELWET max="89" min="84"/> <HEAT min="-5" max="-3"/> </FORECAST>
<FORECAST day="7" month="11" year="2009" hour="12" tod="2" predict="66" weekday="7"> <PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="766" min="764"/> <TEMPERATURE max="-1" min="-3"/> <WIND min="2" max="5" direction="2"/> <RELWET max="73" min="68"/> <HEAT min="-3" max="-1"/> </FORECAST>
<FORECAST day="7" month="11" year="2009" hour="18" tod="3" predict="72" weekday="7"> <PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="766" min="764"/> <TEMPERATURE max="-2" min="-4"/> <WIND min="2" max="5" direction="2"/> <RELWET max="75" min="70"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="8" month="11" year="2009" hour="0" tod="0" predict="78" weekday="1"> <PHENOMENA cloudiness="2" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="768" min="766"/> <TEMPERATURE max="-3" min="-5"/> <WIND min="2" max="5" direction="3"/> <RELWET max="78" min="73"/> <HEAT min="-5" max="-3"/> </FORECAST>
<FORECAST day="8" month="11" year="2009" hour="6" tod="1" predict="84" weekday="1"> <PHENOMENA cloudiness="2" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="769" min="767"/> <TEMPERATURE max="-4" min="-6"/> <WIND min="3" max="6" direction="3"/> <RELWET max="80" min="75"/> <HEAT min="-6" max="-4"/> </FORECAST>
<FORECAST day="8" month="11" year="2009" hour="12" tod="2" predict="90" weekday="1"> <PHENOMENA cloudiness="2" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="771" min="769"/> <TEMPERATURE max="-2" min="-4"/> <WIND min="3" max="6" direction="4"/> <RELWET max="66" min="61"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="8" month="11" year="2009" hour="18" tod="3" predict="96" weekday="1"> <PHENOMENA cloudiness="2" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="771" min="769"/> <TEMPERATURE max="-2" min="-4"/> <WIND min="3" max="6" direction="3"/> <RELWET max="62" min="57"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="9" month="11" year="2009" hour="0" tod="0" predict="102" weekday="2"> <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="771" min="769"/> <TEMPERATURE max="-3" min="-5"/> <WIND min="3" max="6" direction="4"/> <RELWET max="66" min="61"/> <HEAT min="-5" max="-3"/> </FORECAST>
<FORECAST day="9" month="11" year="2009" hour="6" tod="1" predict="108" weekday="2"> <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="772" min="770"/> <TEMPERATURE max="-4" min="-6"/> <WIND min="3" max="6" direction="4"/> <RELWET max="61" min="56"/> <HEAT min="-7" max="-5"/> </FORECAST>
<FORECAST day="9" month="11" year="2009" hour="12" tod="2" predict="114" weekday="2"> <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="771" min="769"/> <TEMPERATURE max="-3" min="-5"/> <WIND min="3" max="6" direction="4"/> <RELWET max="54" min="49"/> <HEAT min="-6" max="-4"/> </FORECAST>
<FORECAST day="9" month="11" year="2009" hour="18" tod="3" predict="120" weekday="2"> <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="769" min="767"/> <TEMPERATURE max="-1" min="-3"/> <WIND min="3" max="6" direction="4"/> <RELWET max="47" min="42"/> <HEAT min="-4" max="-2"/> </FORECAST>
<FORECAST day="10" month="11" year="2009" hour="0" tod="0" predict="126" weekday="3"> <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/> <PRESSURE max="767" min="765"/> <TEMPERATURE max="-1" min="-3"/> <WIND min="5" max="9" direction="5"/> <RELWET max="58" min="53"/> <HEAT min="-7" max="-5"/> </FORECAST>
<FORECAST day="10" month="11" year="2009" hour="6" tod="1" predict="132" weekday="3"> <PHENOMENA cloudiness="3" precipitation="6" rpower="0" spower="0"/> <PRESSURE max="766" min="764"/> <TEMPERATURE max="-1" min="-3"/> <WIND min="3" max="6" direction="5"/> <RELWET max="71" min="66"/> <HEAT min="-4" max="-2"/> </FORECAST>
</TOWN> </REPORT> </MMWEATHER>
|
На выходе нужно получить: Код | <table width="100%" border="1"> <tr> <th> </th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th> <th>10</th> </tr> <tr> <td>0</td> <td>-</td> <td>-2... -4</td> <td>-2... -4</td> <td>-3... -5</td> <td>-3... -5</td> <td>-1... -3</td> </tr> <tr> <td>1</td> <td>-4... -6</td> <td>-2... -4</td> <td>-3... -5</td> <td>-4... -6</td> <td>-4... -6</td> <td>-1... -3</td> </tr> <tr> <td>2</td> <td>-2... -4</td> <td>-1... -3</td> <td>-1... -3</td> <td>-2... -4</td> <td>-3... -5</td> <td>-</td> </tr> <tr> <td>3</td> <td>-1... -3</td> <td>0... -2</td> <td>-2... -4</td> <td>-2... -4</td> <td>-1... -3</td> <td>-</td> </tr> </table>
|
Т.е. группировка по уникальным дням и прогноз по времени дня построчно. Сделал так: Код | <?xml version="1.0" encoding="windows-1251"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="groupDay" match="FORECAST" use="@day" /> <xsl:key name="groupTod" match="FORECAST" use="@tod" /> <xsl:template match="TOWN"> <table border="1"> <tr> <th>Label</th> <xsl:apply-templates select="FORECAST[generate-id(.) = generate-id(key('groupDay', @day))]" mode="header" /> </tr> <xsl:apply-templates select="FORECAST[generate-id(.) = generate-id(key('groupTod', @tod))]" > <xsl:sort select="@tod" order="ascending" /> </xsl:apply-templates> </table> </xsl:template>
<xsl:template match="FORECAST" mode="header"> <th> <xsl:value-of select="@day" /> </th> </xsl:template>
<xsl:template match="FORECAST"> <tr> <th><xsl:value-of select="@tod" /></th> <xsl:for-each select="key('groupTod', @tod)"> <td> <xsl:value-of select="TEMPERATURE/@min" />...<xsl:value-of select="TEMPERATURE/@max" /> </td> </xsl:for-each> </tr> </xsl:template> </xsl:stylesheet>
|
Все ок. Осталась одна проблема. Если отсутствуют ноды (FORECAST) с @tod = 0 или 1 или 2 или 3, то выводить пустую ячейку. Как поступить в этом случае? Спасибо.
|