Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.26;
Скачать: CL | DM;

Вниз

Сортировка в XSL   Найти похожие ветки 

 
Юрий Зотов ©   (2009-05-24 14:47) [0]

Есть такой XML (фрагмент):

<Root>
 <Doc>
   <Date1>05.01.2008</Date1>
   <Date2>03.01.2008</Date2>
 </Doc>
 <Doc>
   <Date1>10.01.2008</Date>
   <Date2>02.01.2008</Date2>
 </Doc>
  ...
</Root>

В исходном XML такие документы отсортированы по Date1. Количество документов произвольное. Формат дат именно такой: dd.MM.yyyy

Задача: написать XSL, выводящий самое раннее значение Date2 в его исходном формате.

Пытался сделать пересортировку:
1. В каждый элемент Doc добавляется подэлемент с именем ComparableDate;
2. Значением этого подэлемента назначается Date2, преобразованное в формат yyyyMMdd;
3. В apply-template используется sort по этому подэлементу.
4. В value-of берется значение Date2 первого из пересортированных Doc.

И ни фига не получается. Преобразование срабатывает без формальных ошибок, но значения всех подэлементов ComparableDate остаются пустыми - естественно, сортировка по ним и не работает.

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

Великая просьба к знатокам: дать пример решения задачи.

Заранее спасибо.


 
Медвежонок Пятачок ©   (2009-05-24 23:27) [1]

до конца непонял, что именно надо, но вот сквозной вывод всех дочених к Doc узлов, с сортировкой по датам

 <xsl:for-each select="/Root/Doc/*">
  <xsl:sort select="concat(substring(.,7,4),substring(.,4,2),substring(.,1,2))" />
  <br/>
  <xsl:value-of select="." />
 </xsl:for-each>


 
Юрий Зотов ©   (2009-05-25 00:13) [2]

> Медвежонок Пятачок ©   (24.05.09 23:27) [1]

Спасибо.

> до конца непонял, что именно надо, но вот сквозной вывод...

Нужно вывести минимальную Date2. Только ее одну.

То есть нужно что-то типа этого:
<xsl:value-of select="min(date(/Root/Doc/Date2))"/>

Но... функций min и date, увы, нет. Вот и приходится изгаляться.


 
Медвежонок Пятачок ©   (2009-05-25 00:18) [3]

<xsl:for-each select="/Root/Doc/*">
  <xsl:sort select="concat(substring(.,7,4),substring(.,4,2),substring(.,1,2))" />

  <xsl:if test="position()=1">

   <xsl:value-of select="." />

  </xsl:if>
 </xsl:for-each>

Либо внутри ифа вызвать call-template который выведет значение


 
Медвежонок Пятачок ©   (2009-05-25 00:23) [4]

Ну и еще в фор-ич"е звезду заменить на Date2


 
Юрий Зотов ©   (2009-05-25 00:55) [5]

> Медвежонок Пятачок ©   (25.05.09 00:18) [3]

Спасибо огромное.

Основываясь на [1], я сначала и сделал через call-template - но c position, конечно, проще.



Страницы: 1 вся ветка

Текущий архив: 2009.07.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
15-1240783011
xenonxenon
2009-04-27 01:56
2009.07.26
Как соединить много текстовых файлов...


15-1243283409
Юрий
2009-05-26 00:30
2009.07.26
С днем рождения ! 26 мая 2009 вторник


15-1242938302
Юрий
2009-05-22 00:38
2009.07.26
С днем рождения ! 22 мая 2009 пятница


2-1243791655
Сергей
2009-05-31 21:40
2009.07.26
TTreeNode


15-1243162054
Юрий Зотов
2009-05-24 14:47
2009.07.26
Сортировка в XSL