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

XSLT. Как отобразить даты в табличке?

Метки: [без меток]
2008-03-13 20:33:01 [обр] Юрий(5/8)[досье]

Господа, есть исходный XML:

<dates>
<item date_start="2008-04-26"/>
<item date_start="2008-04-28"/>
<item date_start="2008-05-01"/>
<item date_start="2008-05-03"/>
<item date_start="2008-05-09"/>
</dates>

Мне нужно упорядочить даты в табличку по месяцам, тоесть? что бы из исходного XML получить таблицу следующего вида:

<table>
<tr>
<td>04</td>
<td>05</td>
</tr>
<tr>
<td>2008-04-26</td>
<td>2008-05-01</td>
</tr>
<tr>
<td>2008-04-28</td>
<td>2008-05-03</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>2008-05-09</td>
</tr>
</table>

На ум приходит только группировка по ключу. Пока сделал типа такого, что бы отобрать месяцы, но пример не работает. Да, и забегая вперед как отгенерировать пустые ячейки?

<xsl:key name="month" match="item" use="@date_start"/>
<xsl:for-each select="item[generate-id() = generate-id(key('month',@date_start))]/@date_start">
<xsl:value-of select="."/>
</xsl:for-each>
спустя 11 часов [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]

модифицируйте приложение, которое генерит xml, чтобы оно отдавало вам удобный xml:

<dates>
  <item date_start="2008-04-26" mon="4" />
  <item date_start="2008-04-28" mon="4" />
  <item date_start="2008-05-01" mon="5" />
  <item date_start="2008-05-03" mon="5" />
  <item date_start="2008-05-09" mon="5" />
</dates>

или

<dates>
  <item>
    <date_start>
      <year>2008</year>
      <month>04</month>
      <mday>26</mday>
    </date_start>
  </item>
  <!-- ... -->
</dates>

дальше станет намного легче и Вам, и xslt-процессору.

спустя 3 часа 7 минут [обр] Михаил Кюршин aka ya-ya(0/414)[досье]

в принципе это просто:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
   
   <xsl:key name="month" match="item" use="substring(@date_start,6,2)" />
   
   <xsl:template match="/">
   
      <xsl:for-each select="//item[generate-id()=generate-id(key('month', substring(@date_start,6,2)))]">
         <xsl:variable name="month" select="substring(@date_start,6,2)" />
         Month: <xsl:value-of select="$month" />
            Dates:
            <xsl:for-each select="//item[substring(@date_start,6,2) = $month]">
               <xsl:value-of select="@date_start" /><xsl:if test="not(position()=last())">,</xsl:if>
            </xsl:for-each>
         
      </xsl:for-each>
                     
      
   </xsl:template>
   
</xsl:stylesheet>

работает на libxslt

спустя 2 часа 10 минут [обр] Юрий(5/8)[досье]

Михаил Кюршин aka ya-ya[досье],
Немного не так. Поправлю.
Даты идут таким образом:

 
<?xml version="1.0" encoding="windows-1251"?>
<site>
<podname>
<dates>
<item date_start="2008-04-26"/>
<item date_start="2008-04-28"/>
<item date_start="2008-05-01"/>
<item date_start="2008-05-03"/>
<item date_start="2008-05-09"/>
</dates>
</podname>
<podname>
<dates>
<item date_start="2008-04-26"/>
<item date_start="2008-05-08"/>
<item date_start="2008-05-19"/>
<item date_start="2008-06-03"/>
<item date_start="2008-06-14"/>
<item date_start="2008-06-26"/>
</dates>
</podname>
...
</site>

Этих <podname> может быть сколь угодно.
Сделал по вашему варианту:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
   
<xsl:key name="month" match="item" use="substring(@date_start,6,2)" />
   
<xsl:template match="/">
<xsl:for-each select="site/podname/dates">
<table border="1">
<tr><td>
<xsl:for-each select="item[generate-id()=generate-id(key('month', substring(@date_start,6,2)))]">
<xsl:variable name="month" select="substring(@date_start,6,2)" />
Month: <xsl:value-of select="$month" /><br/>
</xsl:for-each>
</td></tr>
</table>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Мне нужно выдрать уникальные месяцы только для каждого podname.
Выходит бред какой-то. С первого списка дат выходит правильно 04 и 05, а со второго только 06 (!) Где-то тут с группировкой не так. Если вставить еще один список дат, в котором будут месяцы 04,05,и 06, то вывод вообще не будет. Что делать?

спустя 20 минут [обр] Михаил Кюршин aka ya-ya(0/414)[досье]
Мне нужно выдрать уникальные месяцы только для каждого podname.
т.е. вам для каждого podname нужна таблица (как в первом примере) с уникальностью месяцев? А если попробуете описать задачу ещё шире? может найдётся другое решение
спустя 4 минуты [обр] Юрий(5/8)[досье]
Нет, шире уже не нужно
спустя 8 минут [обр] Юрий(5/8)[досье]

Да совершенно верно!!!

Задача простая для каждого podname с датами сделать примерно следующее:

0405
2008-04-262008-05-01
2008-04-282008-05-03
2008-05-09

И так для каждого podname с датами.

спустя 3 минуты [обр] Алексей Севрюков(14/1280)[досье]
Юрий[досье] с какими podname? Вы наверно вместо ответа в существующую тему решили новую создать? Причем без ссылки на старую ))
спустя 41 секунду [обр] Алексей Севрюков(14/1280)[досье]
Ой, я прошу прощения. Это был глюк с настройками сайдбара )
спустя 36 минут [обр] Михаил Кюршин aka ya-ya(0/414)[досье]
Юрий[досье] я не уверен, но ключ тогда не поможет — он работает для всех нод, которые попадают под match. Лично у меня никаких идей, кроме извращений нет, я бы пересмотрел задачу и, как сказал уже Dennis F. Latypoff aka funky_dennis, модифицировал бы приложение
спустя 11 минут [обр] Юрий(5/8)[досье]

Мда... Задача простейшая - решения нет ;( Ну что же, буду пробовать модифицировать входные данные.

P.S. Тема открыта, может кто-то еще подскажет решение.

спустя 4 часа 33 минуты [обр] Юрий(5/8)[досье]

Так, переделал входной XML следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<site>
<podname>
<dates>
<month month="04">
<item date_start="2008-04-26"/>
<item date_start="2008-04-28"/>
</month>
<month month="05">
<item date_start="2008-05-01"/>
<item date_start="2008-05-03"/>
<item date_start="2008-05-09"/>
</month>
</dates>
</podname>
<podname>
<dates>
<month month="04">
<item date_start="2008-04-26"/>
</month>
<month month="05"> 
<item date_start="2008-05-08"/>
<item date_start="2008-05-19"/>
</month>
<month month="06">
<item date_start="2008-06-03"/>
<item date_start="2008-06-14"/>
<item date_start="2008-06-26"/>
</month>
</dates>
</podname>
</site>

Как теперь сделать таблицу (пример которой выше)?

Powered by POEM™ Engine Copyright © 2002-2005