Форум: "Прочее";
Текущий архив: 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