Ordinamento e raggruppamento con XSLT

Riporto un semplice esempio per poter fare il sorting e raggruppamento con i template XSL.

Esempio di xml sorgente:

<GROUP>
	<ITEM>
		<NAME>Name1</NAME>
		<INFO>
			<INFOTYPE>
				<ID1>001</ID1>
				<ID2>001</ID2>
				<ITEMTYPE>TYPE1</ITEMTYPE>
			</INFOTYPE>
		</INFO>
	</ITEM>
	<ITEM>
		<NAME>Name2</NAME>
		<INFO>
			<INFOTYPE>
				<ID1>002</ID1>
				<ID2>002</ID2>
				<ITEMTYPE>TYPE1</ITEMTYPE>
			</INFOTYPE>
		</INFO>
	</ITEM>
	<ITEM>
		<NAME>Name3</NAME>
		<INFO>
			<INFOTYPE>
				<ID1>003</ID1>
				<ID2>003</ID2>
				<ITEMTYPE>TYPE2</ITEMTYPE>
			</INFOTYPE>
		</INFO>
	</ITEM>
</GROUP>

template xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<grouped>
			<xsl:for-each select="//ITEMTYPE[not(. = following::ITEMTYPE)]">
				<xsl:sort/>
				<group>
					<title>
						<xsl:value-of select="."/>
					</title>
					<xsl:for-each select="//ITEM[INFO/INFOTYPE/ITEMTYPE=current()]">
						<xsl:sort select="NAME"/>
						<name>
							<xsl:value-of select="NAME"/>
						</name>
					</xsl:for-each>
				</group>
			</xsl:for-each>
		</grouped>
	</xsl:template>
</xsl:stylesheet>

Risultato:

<grouped>
	<group>
		<title>TYPE1</title>
		<name>Name1</name>
		<name>Name2</name>
	</group>
	<group>
		<title>TYPE2</title>
		<name>Name3</name>
	</group>
</grouped>

Leave a Reply