powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Форматирование таблицы
4 сообщений из 4, страница 1 из 1
Форматирование таблицы
    #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
Форматирование таблицы
    #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
Форматирование таблицы
    #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
Форматирование таблицы
    #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
4 сообщений из 4, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Форматирование таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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