Xpoint
   [напомнить пароль]

Форматирование таблицы

Метки: [без меток]
2009-11-02 16:01:19 [обр] walek[досье]

Друзья, помогите пожалуйста.

Есть XML

<?xml version="1.0" ?>
<MMWEATHER>
 <REPORT type="frc3">
  <TOWN index="28722" sname="%D3%F4%E0" latitude="55" longitude="56">

    <FORECAST day="29" month="10" year="2009" hour="12" tod="2" predict="12" weekday="5">
     <PHENOMENA cloudiness="0" precipitation="10" rpower="0" spower="0"/>
     <PRESSURE max="754" min="752"/>
     <TEMPERATURE max="3" min="1"/>
     <WIND min="5" max="9" direction="4"/>
     <RELWET max="52" min="47"/>
     <HEAT min="-3" max="-1"/>
    </FORECAST>

    <FORECAST day="29" month="10" year="2009" hour="18" tod="3" predict="18" weekday="5">
     <PHENOMENA cloudiness="0" precipitation="10" rpower="0" spower="0"/>
     <PRESSURE max="753" min="751"/>
     <TEMPERATURE max="5" min="3"/>
     <WIND min="3" max="6" direction="4"/>
     <RELWET max="52" min="47"/>
     <HEAT min="2" max="4"/>
    </FORECAST>

    <FORECAST day="30" month="10" year="2009" hour="0" tod="0" predict="24" weekday="6">
     <PHENOMENA cloudiness="3" precipitation="10" rpower="0" spower="0"/>
     <PRESSURE max="751" min="749"/>
     <TEMPERATURE max="4" min="2"/>
     <WIND min="5" max="9" direction="4"/>
     <RELWET max="82" min="77"/>
     <HEAT min="-1" max="1"/>
    </FORECAST>

    <FORECAST day="30" month="10" year="2009" hour="6" tod="1" predict="30" weekday="6">
     <PHENOMENA cloudiness="3" precipitation="4" rpower="0" spower="0"/>
     <PRESSURE max="749" min="747"/>
     <TEMPERATURE max="6" min="4"/>
     <WIND min="5" max="9" direction="4"/>
     <RELWET max="80" min="75"/>
     <HEAT min="0" max="2"/>
    </FORECAST>

    <FORECAST day="30" month="10" year="2009" hour="12" tod="2" predict="36" weekday="6">
     <PHENOMENA cloudiness="3" precipitation="4" rpower="1" spower="0"/>
     <PRESSURE max="747" min="745"/>
     <TEMPERATURE max="5" min="3"/>
     <WIND min="5" max="9" direction="4"/>
     <RELWET max="93" min="88"/>
     <HEAT min="-1" max="1"/>
    </FORECAST>

    <FORECAST day="30" month="10" year="2009" hour="18" tod="3" predict="42" weekday="6">
     <PHENOMENA cloudiness="3" precipitation="4" rpower="1" spower="0"/>
     <PRESSURE max="746" min="744"/>
     <TEMPERATURE max="5" min="3"/>
     <WIND min="5" max="9" direction="4"/>
     <RELWET max="97" min="92"/>
     <HEAT min="-1" max="1"/>
    </FORECAST>
  </TOWN>
 </REPORT>
</MMWEATHER>

Нужно привести к виду:

<table width="100%" border="1">
  <tr> 
    <th>29</th>
    <th>30</th>
  </tr>
  <tr> 
    <td>1... 3</td>
    <td>3... 5</td>
  </tr>
  <tr>
    <td>2... 4</td>
    <td>4... 6</td>
  </tr>
  <tr> 
    <td>3... 5</td>
    <td>3... 5</td>
  </tr>
</table>

Но у меня получается только так (в один столбец):

<table border="1">
   <tr>
      <th>29</th>
   </tr>
   <tr>
      <td>1...3</td>
   </tr>
   <tr>
      <th>30</th>
   </tr>
   <tr>
      <td>2...4</td>
   </tr>
   <tr>
      <td>4...6</td>
   </tr>
   <tr>
      <td>3...5</td>
   </tr>
   <tr>
      <td>3...5</td>
   </tr>
<table>

Делал так:

<xsl:key name="groupDay" match="FORECAST" use="@day" />
<xsl:template match="TOWN" >
   <table border="1">
      <xsl:apply-templates select="FORECAST[generate-id(.) = generate-id(key('groupDay', @day))]" />
   </table>
</xsl:template>

<xsl:template match="FORECAST">
   <tr>
      <th><xsl:value-of select="@day" /></th>
   </tr>
   
   <xsl:apply-templates select="key('groupDay', @day)" mode="list" />
</xsl:template>

<xsl:template match="FORECAST" mode="list">
<tr>
   <td>
      <xsl:value-of select="TEMPERATURE/@min" disable-output-escaping="yes" />...
      <xsl:value-of select="TEMPERATURE/@max" disable-output-escaping="yes" />
   </td>
</tr>
</xsl:template>

Спасибо.

спустя 2 часа 3 минуты [обр] Lynn «Кофеман»(52/571)[досье]

Мне непонятно, зачем вам такая странная группировка?

2930
1..3 (29)3..5 (29)
2..4 (30)4..6 (30)
3..5 (30)3..5 (30)

В скобках дни, из которых взята температура, как я понимаю. По-моему это какая-то бредовая таблица, вам не кажется?

спустя 2 часа [обр] Илья Cтpeльцын aka SelenIT(0/171)[досье]

По столбцам таблицы — дни, а по строкам — часы, я верно понимаю?

Тогда и группировать, имхо, надо бы не по дням, а по часам (сорри за невольный каламбур:). А по дням уже гонять циклы внутри групп...

спустя 10 часов [обр] walek[досье]
Спасибо.
По столбцам — дни: 29, 30 ...
По строкам температура, в зависимости от времени суток и соответствующая дню.
Т.е. так:
2930
1...32...4
3...54...6
3...5
3...5
спустя 3 часа 31 минуту [обр] Lynn «Кофеман»(52/571)[досье]
Может всё-таки так?
2930
2..4
4..6
1..33..5
3..53..5
спустя 1 час [обр] walek[досье]
Lynn «Кофеман»[досье]
Да, точно должно быть так.
спустя 7 дней [обр] walek[досье]

Сделал так.

<?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, то выводить пустую ячейку.
Как поступить в этом случае?

спустя 21 час [обр] walek[досье]

Сделал так:

<?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:template match="TOWN">
   <table border="1">
      <tr>
         <th>Label</th>
         <xsl:apply-templates select="FORECAST[not(@day=preceding-sibling::FORECAST/@day)]" mode="header" />
      </tr>
      
      <xsl:call-template name="ROW">
         <xsl:with-param name="tod" select="0" />
      </xsl:call-template>
   </table>
</xsl:template>

<xsl:template match="FORECAST" mode="header">
   <th><xsl:value-of select="@day" /></th>
</xsl:template>

<xsl:template name="ROW">
   <xsl:param name="tod"/>   
   <tr>
      <td><xsl:value-of select="$tod" /></td>
      
      <xsl:for-each select="FORECAST[not(@day=preceding-sibling::FORECAST/@day)]">
         <xsl:variable name="dd" select="@day"/>
         <td>
            <xsl:apply-templates select="../FORECAST[@day=$dd and @tod=$tod]" mode="data"/>
         </td>
      </xsl:for-each>
      
      <xsl:if test="$tod != 3">
         <xsl:call-template name="ROW">
            <xsl:with-param name="tod" select="$tod + 1" />
         </xsl:call-template>
      </xsl:if>
   </tr>
</xsl:template>

<xsl:template match="FORECAST" mode="data">
   <xsl:value-of select="TEMPERATURE/@min" />...<xsl:value-of select="TEMPERATURE/@max" />
</xsl:template>

</xsl:stylesheet>

Все работает.
Все устраивает.

Но хотелось бы узнать, как реализовать с помощью группировки Мюнха, в предыдущем моем сообщении.
Буду благодарен за помощь.

Powered by POEM™ Engine Copyright © 2002-2005