Subject: RE: [xsl] unusual grouping problem From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Sun, 16 Sep 2007 22:27:51 +0100 |
I would do this using sibling recursion. <xsl:template name="group"> <xsl:param name="seq" as="element(lab)*"/> <xsl:param name="current-group" as="element(lab)*"/> <xsl:choose> <xsl:when test="empty($seq)"> <group> <xsl:copy-of select="$current-group"/> </group> </xsl:when> <xsl:when test="$current-group/@type = ./@type"> <group> <xsl:copy-of select="$current-group"/> </group> <xsl:call-template name="group"> <xsl:with-param name="seq" select="remove($seq, 1)"/> <xsl:with-param name="current-group" select="."/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="group"> <xsl:with-param name="seq" select="remove($seq, 1)"/> <xsl:with-param name="current-group" select="($current-group, .)"/> </xsl:call-template> </ </ </ <xsl:template match="/" <xsl:call-template name="group"> <xsl:with-param name="seq" select="/patient/lab"/> <xsl:with-param name="current-group" select="()"/> </xsl:call-template> </ Untested. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: russ@xxxxxxxxxxx [mailto:russ@xxxxxxxxxxx] > Sent: 16 September 2007 21:57 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] unusual grouping problem > > I have what I hope is an interesting grouping problem. I've > tried <for-each-group>, Meunchian technique, and some crazy > home-made <for-each> loops but can't come up with anything that works. > > Source xml is: > <patient> > <lab type="1" /> > <lab type="2" /> > <lab type="3" /> > <lab type="1" /> > <lab type="3" /> > <lab type="1" /> > <lab type="1" /> > <lab type="2" /> > <lab type="3" /> > <lab type="3" /> > <lab type="1" /> > <patient> > > > > The labs are sorted by a timestamp that I've left out for > clarity, and need to remain in that same order. > > I need the labs broken into the fewest number of groups > possible without any group containing the same lab type more > than once. So the above should > produce: > > <patient> > <group> > <lab type="1" /> > <lab type="2" /> > <lab type="3" /> > </group> > <group> > <lab type="1" /> > <lab type="3" > > </group> > <group> > <lab type="1" /> > </group> > <group> > <lab type="1" /> > <lab type="2" /> > <lab type="3" /> > </group> > <group> > <lab type="3"/> > <lab type="1"/> > </group> > </patient> > > > > I'd like to do something like : > <xsl:for-each-group select="/patient/lab " > group-adjacent="every $lab in > current-group() satisfies $lab/@type!=@type"> > > but you can't access current-group() from the grouping > criteria. I need something like a > "members-of-the-group-currently-being-created()" > function. I also tried: > <xsl:for-each-group select="/patient/lab " > group-ending-with="some $lab in preceding-sibling::lab > satisfies $lab/@type=@type"> > > But that identifies duplicates starting from the first lab in > the entire list, not just within the group currently being created. > > > I've also tried some more convoluted and desperate ideas but > I'll save you those details. > > Any help is much appreciated. > > Thanks.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] unusual grouping problem, russ | Thread | Re: [xsl] unusual grouping problem, David Carlisle |
[xsl] unusual grouping problem, russ | Date | Re: [xsl] unusual grouping problem, David Carlisle |
Month |