RE: [xsl] nested grouping problem using group-adjacent

Subject: RE: [xsl] nested grouping problem using group-adjacent
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 19 Apr 2007 09:54:41 +0100
You'll find a worked example that includes a solution to this problem at

http://www.idealliance.org/proceedings/xml04/papers/111/mhk-paper.html

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: Jeff Hatch [mailto:hatchjk@xxxxxxxxxxxxx] 
> Sent: 18 April 2007 16:44
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] nested grouping problem using group-adjacent
> 
> All,
> 
> Having tried to code for this for the past several ... well, 
> I won't admit how long ... I throw it to you for help and beg 
> for mercy. If the solution exists in an archive or faq 
> somewhere, and I've just missed it in my searches, please 
> refer me to it.
> 
> Input xml:
> 
> <objects>
> 	<object depth="1">data</object>
> 	<object depth="1">data</object>
> 	<object depth="2">data</object>
> 	<object depth="2">data</object>
> 	<object depth="3">data</object>
> 	<object depth="3">data</object>
> 	<object depth="3">data</object>
> 	<object depth="2">data</object>
> 	<object depth="2">data</object>
> 	<object depth="1">data</object>
> 	<object depth="2">data</object>
> 	<object depth="1">data</object>
> </objects>
> 
> Required output:
> 
> <objects>
> 	<group-1>
> 		<object depth="1">data</object>
> 		<object depth="1">data</object>
> 		<group-2>
> 			<object depth="2">data</object>
> 			<object depth="2">data</object>
> 			<group-3>
> 				<object depth="3">data</object>
> 				<object depth="3">data</object>
> 				<object depth="3">data</object>
> 			</group-3>
> 			<object depth="2">data</object>
> 			<object depth="2">data</object>
> 		</group-2>
> 		<object depth="1">data</object>
> 		<group-2>
> 			<object depth="2">data</object>
> 		</group-2>
> 		<object depth="1">data</object>
> 	</group-1>
> </objects>
> 
> My futile attempt:
> 
> <xsl:template match="@*|node()">
> 		<xsl:copy>
> 			<xsl:apply-templates select="@*|node()"/>
> 		</xsl:copy>
> 	</xsl:template>
> 	<xsl:template match="objects">
> 		<xsl:for-each-group select="*" 
> group-adjacent="(@depth >= 1)">
> 			<xsl:element name="group-1">
> 				<xsl:for-each-group 
> select="current-group()" group- adjacent="(@depth >= 2)">
> 					<xsl:element name="group-2">
> 						
> <xsl:for-each-group select="current-group()" group- 
> adjacent="(@depth >= 3)">
> 							
> <xsl:element name="group-3">
> 								
> <xsl:apply-templates select="current-group()"/>
> 							</xsl:element>
> 						</xsl:for-each-group>
> 					</xsl:element>
> 				</xsl:for-each-group>
> 			</xsl:element>
> 		</xsl:for-each-group>
> 	</xsl:template>
> 
> My attempt is producing the wrong output, in that (for example) the
> depth-1 elements are inappropriately being nested in group-2 and
> group-3 elements. I've done quite a bit of grouping work with 
> xslt 2.0 for other applications, but for some reason this one 
> escapes me.
> 
> The input example is a scaled-down structure that would 
> represent flat lists in document-oriented xml that need to be 
> up-translated for structure and depth nesting.
> 
> Thanks in advance for any help you could provide ...
> 
> Jeff Hatch
> Electronic Media Group
> Curriculum Department
> Church of Jesus Christ of Latter-day Saints
> 
> 
> 
> 
> ----------------------------------------------------------------------
> NOTICE: This email message is for the sole use of the 
> intended recipient(s) and may contain confidential and 
> privileged information. Any unauthorized review, use, 
> disclosure or distribution is prohibited. If you are not the 
> intended recipient, please contact the sender by reply email 
> and destroy all copies of the original message.

Current Thread