Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Форматирование таблицы / 4 сообщений из 4, страница 1 из 1
09.11.2009, 11:12
    #36298177
walek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование таблицы
Друзья, помогите пожалуйста.
Поглядел схожие проблемы в этом форуме, но как мне показалось немного не то.

Есть XML (да, он громоздкий, но уж какой есть).
Пояснения по XML.
Есть узлы FORECAST, в которых содержатся часовые прогнозы по дням.
В атрибутах tod указываются цифры-интервалы (означают время дня: 0-ночь, 1-утро, 2-день, 3-вечер), на которое составлен прогноз. Есть некоторая особенность: суточный прогноз может не содержать всех интервалов, т.е. могут отсутствовать 0 или 1. И т.д.

автор<?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>

На выходе нужно получить таблицу вида (применительно к приведенному XML):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
<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>

Т.е. группировка по уникальным дням и прогноз по времени дня построчно.

Делал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<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>

Но таблица получается в один столбец.
Может кто сталкивался с подобной проблемой?

Спасибо.
...
Рейтинг: 0 / 0
09.11.2009, 22:39
    #36299987
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<xsl:key name="groupDay" match="FORECAST" use="@day" />
<xsl:template match="TOWN" >
   <table border="1">
      <tr>
        <xsl:apply-templates select="FORECAST[generate-id(.) = generate-id(key('groupDay', @day))]" mode="showDay"/>
      </tr>
      <xsl:apply-templates select="FORECAST[generate-id(.) = generate-id(key('groupDay', @day))]" />
   </table>
</xsl:template>

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

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

<xsl:template match="FORECAST" mode="list">
   <td>
      <xsl:value-of select="TEMPERATURE/@min" disable-output-escaping="yes" />...
      <xsl:value-of select="TEMPERATURE/@max" disable-output-escaping="yes" />
   </td>
</xsl:template>
...
Рейтинг: 0 / 0
10.11.2009, 08:01
    #36300256
walek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование таблицы
Vasilisk_
Спасибо, но не все так просто.

Этот вариант формирует таблицу в виде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
<table border="1">
	<tr>
		<th> 5 </th>
		<th> 6 </th>
		<th> 7 </th>
		<th> 8 </th>
		<th> 9 </th>
		<th> 10 </th>
	</tr>
	<tr>
		<td>- 6 ...- 4 </td>
		<td>- 4 ...- 2 </td>
		<td>- 3 ...- 1 </td>
	</tr>
	<tr>
		<td>- 4 ...- 2 </td>
		<td>- 4 ...- 2 </td>
		<td>- 3 ...- 1 </td>
		<td>- 2 ... 0 </td>
	</tr>
	<tr>
		<td>- 4 ...- 2 </td>
		<td>- 5 ...- 3 </td>
		<td>- 3 ...- 1 </td>
		<td>- 4 ...- 2 </td>
	</tr>
	<tr>
		<td>- 5 ...- 3 </td>
		<td>- 6 ...- 4 </td>
		<td>- 4 ...- 2 </td>
		<td>- 4 ...- 2 </td>
	</tr>
	<tr>
		<td>- 5 ...- 3 </td>
		<td>- 6 ...- 4 </td>
		<td>- 5 ...- 3 </td>
		<td>- 3 ...- 1 </td>
	</tr>
	<tr>
		<td>- 3 ...- 1 </td>
		<td>- 3 ...- 1 </td>
	</tr>
</table>

Т.е. в корне не верная таблица. Прогнозы 5 числа залезают на 6 и 7 числа и т.д.

Как вы считаете, можно ли этот пример адаптировать под мою задачу http://groups.google.com/group/xslt-portugal/web/html-table---horizontal ?

У меня пока плохо получается.
...
Рейтинг: 0 / 0
11.11.2009, 14:02
    #36303872
walek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форматирование таблицы
Сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<?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, то выводить пустую ячейку.

Как поступить в этом случае?
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Форматирование таблицы / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]