Главная страница
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.019 c
15-1242933798
Tany
2009-05-21 23:23
2009.07.26
Поставить разрыв страницы


11-1203768494
andreil
2008-02-23 15:08
2009.07.26
Как изменить дату файла?


15-1242822099
easy
2009-05-20 16:21
2009.07.26
Переезд PDA-шлюза dmgate


2-1243871211
Максим
2009-06-01 19:46
2009.07.26
TPopUpMenu + WM_COMMAND


2-1243763837
snake-as
2009-05-31 13:57
2009.07.26
Приближение битмапа.