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