2002-09-24 18:13:42 UTC

Очень часто, при выводе данных, возникает задача сгруппировать эти данные по какому-либо признаку, — дате, категории, важности и т.д. С помощью связки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>

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

2002-09-24 18:13:42 UTC snippet web xslt