RE: [xsl] group-by deep equality?

Subject: RE: [xsl] group-by deep equality?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 10 Jan 2006 21:34:25 -0000
Actually 1 and 3 in your example aren't deep-equal() because the attribute
value is different. But if they were, I don't think that would make things
much easier.

I think the way to tackle this is to write a function that constructs the
grouping key you want as a string (perhaps using saxon:serialize()) and then
use for-each-group on that. 

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

> -----Original Message-----
> From: David Sewell [mailto:dsewell@xxxxxxxxxxxx] 
> Sent: 10 January 2006 21:14
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] group-by deep equality?
> 
> I'm trying to figure out how to group elements by deep 
> equality of node
> sequences. Given input data like this:
> 
> <list>
>    <item n="1">Life of Brian</item>
>    <item n="2"><i>Life</i> of Brian</item>
>    <item n="3">Life of Brian</item>
>    <item n="4"><i>Life of Brian</i></item>
> </list>
> 
> I want groups of <item> elements whose contents that are all 
> deep-equal() to one
> another. So in this case there should be three groups:
> 
>    <item n="1">Life of Brian</item>
>    <item n="3">Life of Brian</item>
> 
>    <item n="2"><i>Life</i> of Brian</item>
> 
>    <item n="4"><i>Life of Brian</i></item>
> 
> <xsl:for-each-group select="item" group-by="."> creates only 
> one group,
> because the atomic value of each <item> node is the concatenated value
> of descendant text nodes, i.e. "Life of Brian" in each case.
> 
> For the above data, the following will in fact produce the 
> desired three groups:
> 
>   <xsl:for-each-group select="item" group-by="concat(., 
> count(.//node()))">
> 
> but it's not a generalizable solution because it would treat
> 
>    <item n="5">Life of <i>Brian</i></item>
> 
> as equivalent to item #2 (they both have 3 descendant nodes).
> 
> Is there a pure @group-by solution, or will this require 
> something more
> complicated involving @group-by-adjacent and deep-equal()?
> 
> -- 
> David Sewell, Editorial and Technical Manager
> Electronic Imprint, The University of Virginia Press
> PO Box 400318, Charlottesville, VA 22904-4318 USA
> Courier: 310 Old Ivy Way, Suite 302, Charlottesville VA 22903
> Email: dsewell@xxxxxxxxxxxx   Tel: +1 434 924 9973
> Web: http://www.ei.virginia.edu/

Current Thread