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