Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];

Вниз

Сортировка в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.006 c
2-1243446563
Eugene1501
2009-05-27 21:49
2009.07.26
Сжатие данных в Delphi стандартными компонентами


2-1243856641
Black
2009-06-01 15:44
2009.07.26
Пара вопросов и траблов


15-1242988527
Gans
2009-05-22 14:35
2009.07.26
Подскажите как называется программа


11-1204046814
andreil
2008-02-26 20:26
2009.07.26
Как быстро сравнить два файла?


2-1243432407
Darvin
2009-05-27 17:53
2009.07.26
Странное поведение FindDialog





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский