powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выбрать 3 последних узла
8 сообщений из 8, страница 1 из 1
Выбрать 3 последних узла
    #36775288
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="windows-1251" ?>
<forumlist>
    <type id="30" name="Бизнес и управление" place="http://guest.yandex.ru/business/">
      <forum id="275" name="Проблемы привлечения рекламных бюджетов в регионы" last_message="20010808 14:45:48"/>
      <forum id="1147" name="Форум с Ильей Слуцким" last_message="20030416 18:04:39"/>
      <forum id="1169" name="Форум с Леонидом Меламедом" last_message="20030807 17:21:39"/>
    </type>
    <type id="18" name="Кино и театр" place="http://guest.yandex.ru/cinema/">
      <forum id="1133" name="Форум с Дмитрием Богачевым" last_message="20030123 18:18:24"/>
      <forum id="1138" name="Форум с Александром Ведерниковым и Виктором Крамером" last_message="20030328 15:45:15"/>
      <forum id="1180" name="Конференция с Евгением Арье и Давидом Смелянским" last_message="20030827 16:10:00"/>
    </type>
    <type id="34" name="Литература" place="http://guest.yandex.ru/literature/">
      <forum id="268" name="Конференция с Михаилом Мишиным" last_message="20010712 18:58:59"/>
      <forum id="279" name="Конференция с Александрой Марининой" last_message="20011005 17:01:44"/>
      <forum id="321" name="Конференция с В.В. Шахиджаняном" last_message="20020219 20:22:17"/>
    </type>
</forumlist>

Задача: отсортировать 3 последних forum в хронологическом порядке.
Сортировку по дате сделал, но не могу вывести 3 последних forum (в хронологическом порядке, более свержие наверху):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" />

<xsl:template match="forumlist">
	<ul>
		<xsl:apply-templates select="type/forum">
		<xsl:sort select="concat(substring(@last_message, 1, 4), substring(@last_message, 4, 2), substring(@last_message, 5, 2), substring(@last_message, 10, 2), substring(@last_message, 13, 2), substring(@last_message, 16, 2))" order="descending" data-type="number" />
		</xsl:apply-templates>
	</ul>
</xsl:template>

<xsl:template match="forum">
	<li>
		<xsl:value-of select="@name" /> 
		<xsl:value-of select="substring(@last_message, 1, 4)" />.<xsl:value-of select="substring(@last_message, 4, 2)" />.<xsl:value-of select="substring(@last_message, 5, 2)" /> 
		<xsl:value-of select="substring(@last_message, 10, 2)" />:<xsl:value-of select="substring(@last_message, 13, 2)" />:<xsl:value-of select="substring(@last_message, 16, 2)" />
	</li>
</xsl:template>
</xsl:stylesheet>

Помогите пожалуйста, спасибо.
...
Рейтинг: 0 / 0
Выбрать 3 последних узла
    #36776135
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
<xsl:if test="position() < 3">
  ...........
</xsl:if>
...
Рейтинг: 0 / 0
Выбрать 3 последних узла
    #36777792
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Японский формат даты разобран не правильно:

substring(@last_message, 1, 4) - год
substring(@last_message, 5, 2) - месяц, не 4, 2
substring(@last_message, 7, 2) - день, не 5, 2


Все это сокращается при сортировке в:

substring(@last_message, 1, 8)

walek, ваша задача красиво не решается, т.к. произведена ошибка при формировании XML.
Все новостные линии, форумы и прочее должны сортироваться на уровне базы, SQL средствами, если это не возможно, значит средствами программы генерящей XML, тогда вы сможете написать быструю выборку
<xsl:apply-templates select="type/forum [ position() <= 3 ]" />
и не обрабатывать все полотенце тегов.

В вашем же случае, при сортировке, такой финт невозможен и приходится делать кучу пустых итераций.
...
Рейтинг: 0 / 0
Выбрать 3 последних узла
    #36777816
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще hint:

Код: plaintext
1.
2.
<xsl:apply-templates select="type/forum">
  <xsl:sort select="@last_message order="descending" />
</xsl:apply-templates>

Выдаст аналогичный результат, но быстрее.
...
Рейтинг: 0 / 0
Выбрать 3 последних узла
    #36778600
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andry TrushinЯпонский формат даты разобран не правильно:

substring(@last_message, 1, 4) - год
substring(@last_message, 5, 2) - месяц, не 4, 2
substring(@last_message, 7, 2) - день, не 5, 2

Да, действительно, был невнимателен.

авторВсе это сокращается при сортировке в:

substring(@last_message, 1, 8)
Отличное предложение!
Спасибо.

автор walek, ваша задача красиво не решается, т.к. произведена ошибка при формировании XML.
Все новостные линии, форумы и прочее должны сортироваться на уровне базы, SQL средствами, если это не возможно, значит средствами программы генерящей XML, тогда вы сможете написать быструю выборку
<xsl:apply-templates select="type/forum [ position() <= 3 ]" />
и не обрабатывать все полотенце тегов.
Это всё понятно, просто мне интересно было найти решение этой задачи.
...
Рейтинг: 0 / 0
Выбрать 3 последних узла
    #36778601
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andry Trushinеще hint:

Код: plaintext
1.
2.
<xsl:apply-templates select="type/forum">
  <xsl:sort select="@last_message order="descending" />
</xsl:apply-templates>

Выдаст аналогичный результат, но быстрее.Вот это не понял.
...
Рейтинг: 0 / 0
Выбрать 3 последних узла
    #36778935
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
walek,

При таком формате дата/времени - "20030328 15:45:15", сортировка строк будет вести себя аналогично, т.е. сортировать так как вам надо, я там только кавычку забыл, правильно так:
Код: plaintext
1.
2.
<xsl:apply-templates select="type/forum">
  <xsl:sort select="@last_message" order="descending" />
</xsl:apply-templates>
...
Рейтинг: 0 / 0
Выбрать 3 последних узла
    #36779113
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andry Trushinwalek,

При таком формате дата/времени - "20030328 15:45:15", сортировка строк будет вести себя аналогично, т.е. сортировать так как вам надо, я там только кавычку забыл, правильно так:
Код: plaintext
1.
2.
<xsl:apply-templates select="type/forum">
  <xsl:sort select="@last_message" order="descending" />
</xsl:apply-templates>

Здорово, а я как-то сразу не подумал, спасибо :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выбрать 3 последних узла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]