parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Группировка методом Мюнча

egr 17.09.2002 15:08

Недавно тут была дискуссия о том как делать группировку. Я тут недавно приобрел книжку по XSLT и там есть пара примеров о том как это делается.
Допустип есть такой XML код для новостей или ещё чего-либо:
<?xml version="1.0" encoding="windows-1251"?>
<news>
	<item date="12.01.2002" title="header1">Бла-бла</item>
	<item date="12.01.2002" title="header2">Бла-бла</item>
	<item date="10.01.2002" title="header3">Бла-бла</item>
	<item date="10.01.2002" title="header4">Бла-бла</item>
	<item date="7.01.2002" title="header5">Бла-бла</item>
	<item date="7.01.2002" title="header6">Бла-бла</item>
</news>
Задача вывести это сгруппировав элементы по какому-либо параметру например по дате:
12.01.2002
	все события за это число
10.01.2002
	все события за это число
7.01.2002
	все события за это число
С помощью XSLT это делается достаточно просто:
<?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', .)">
					<b><xsl:value-of select="@title" /></b><br/>
					<xsl:value-of select="." /><p/>
				</xsl:for-each>
				</dd>
		</xsl:for-each>
		</dl>
	</xsl:template>

</xsl:stylesheet>