2002-09-24 18:13:42

Очень часто, при выводе данных, возникает задача сгруппировать эти данные по какому-либо признаку, — дате, категории, важности и т. д. С помощью связкиXML/XSLT это делается достаточно просто.

Например у вас есть список новостей или событий в виде XML:

<news>
	<item date="12.01.2002" title="Новая версия">
	Вышла новая супер-пупер версия нашей софтины
	для автоматического написания 
	кода, - вам даже не надо думать!
	</item>

	<item date="12.01.2002" title="Мы расширяемся">
	И у нас появилась куча новых вакансий
	</item>

	<item date="10.01.2002" title="Новое имя">
	Наша компания переименовывается в Poupkine Ltd.
	</item>

	<item date="10.01.2002" title="Итоги года">
	За прошлый год мы заработали кучу денег, даже
	не ожидали что столько заработаем.
	</item>

	<item date="7.01.2002" title="С рождеством">
	Поздравляем вас с Рождеством
	</item>
</news>

Задача заключается в том, чтобы вывести эти данные сгруппировав по дате:

Дата1
	все события за это число
Дата2
	все события за это число
Дата3
	все события за это число
...

Где Дата1, Дата2, Дата3 ... это уникальные значения атрибута date, взятые из конкретного набора данных.

Я не буду подробно объяснять теоретические основы группировки методом Мюнча, - вы об этом можете прочесть сами в книге XSLT 2-е издание, автор Майкл Кэй, а просто приведу пример стилевой таблицы которая делает указанное преобразование:

<?xml version="1.0" encoding="windows-1251" ?> 

<xsl:stylesheet
	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

	<xsl:key name="dates" match="/news/item" use="@date"/>

	<xsl:template match="/news">

	<xsl:variable name="unique_date"
		select="/news
				/item[generate-id(.)=
					generate-id(key('dates', @date))]
				/@date"
	/>

		<dl>
		<xsl:for-each select="$unique_date">
			<dt><xsl:value-of select="."/></dt>
			<dd>
				<xsl:for-each select="key('dates', .)">
					<strong><xsl:value-of select="@title" /></strong><br/>
					<xsl:value-of select="." /><p/>
				</xsl:for-each>
			</dd>
		</xsl:for-each>
		</dl>
	</xsl:template>

</xsl:stylesheet>

В результате вы получаете требуемый результат в виде HTML:

<dl>
	<dt>12.01.2002</dt>
		<dd>
		<strong>Новая версия</strong><br>
		Вышла новая супер-пупер версия нашей софтины для
		автоматического написания кода, - вам даже не надо думать!
		<p>
		<strong>Мы расширяемся</strong><br>
		И у нас появилась куча новых вакансий
		<p>
		</dd>
	<dt>10.01.2002</dt>
		<dd>
		<strong>Новое имя</strong><br>
		Наша компания переименовывается в Poupkine Ltd.
		<p>
		<strong>Итоги года</strong><br>
		За прошлый год мы заработали кучу денег,
		даже не ожидали что столько заработаем.
		<p>
		</dd>
	<dt>7.01.2002</dt>
		<dd>
		<strong>С рождеством</strong><br>
		Поздравляем вас с Рождеством
		<p>
		</dd>
</dl>

Загрузить пример:

2002-09-24 18:13:42  snippet xslt web
comments powered by Disqus