Главная страница
    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
15-1240341049
Кто б сомневался
2009-04-21 23:10
2009.07.26
Человек - это биоробот


15-1242852156
Германн
2009-05-21 00:42
2009.07.26
Копирование таблицы из pdf в doc


2-1243760229
HRustBB
2009-05-31 12:57
2009.07.26
модальный вызов формы из длл


2-1243260477
Ega23
2009-05-25 18:07
2009.07.26
DevExpress TcxGrid - как добраться до НД при MultiSelet?


2-1243718076
Rembo
2009-05-31 01:14
2009.07.26
TApplicationEvents.OnException получить имя метода из Exception





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский