xsl-list
[Top] [All Lists]

[xsl] RE: Trouble grouping with for-each-group and sort

2010-03-18 14:36:36
Super!  Thanks to Michael Kay and Ken Holman for more instruction on
processing groups.

I used Mr. Kay's suggestion about defining a variable using
perform-sort.  I then passed the variable to process-data, and things
almost worked as advertised.  I needed to use
        as="item() *"
with an asterisk in the variable definition, since the groups contain
several elements.

I was unaware of perform-sort, and was wondering how I was going to sort
the data.  I was only aware of sort being applicable to apply-templates
and for-each constructs.

Thanks for the concise, concrete, and very useful solution.  I was able
to process my data as I expected.

Thanks for taking the time in this forum to help others.

-- Mike Cook

P.S. Not only with this nested for-each-group processing, but for XSL
processing as a whole, it boggles my mind at what must happen behind the
scenes with Saxon or other processors.  All the bookkeeping, let alone
the myriad of constructs and expressions that could be used!  I've had
some experience spent on compiler code generation, I'm sure glad Mr. Kay
has put in the tremendous effort at supplying a worthy tool.


Date: Wed, 17 Mar 2010 18:11:14 -0000
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
From: "Michael Kay" <mike(_at_)saxonica(_dot_)com>
Subject: RE: [xsl] Trouble grouping with for-each-group and sort
Message-ID: <BF158FD61904461FB25DBECFA951D8D6(_at_)Sealion>

I can't immediately see the answer, but I can see the problem:

<xsl:for-each-group select="current-group()" group-by="myns:E">
  <xsl:sort select="current-grouping-key()" data-type="number"/>
  <xsl:sort select="myns:G/myns:sub3/myns:inner" data-type="number"/>

The second sort key is only used when two things have the 
same primary sort
key. But by definition each group has a different 
current-grouping-key, so
this will never happen (remember at this level you are 
sorting the groups,
not the content of a particular group). 

I suspect that you want to use the second sort key to sort 
the contents of
current-group().

                        <xsl:call-template name="process-data" >
                            <xsl:with-param name="data-set"
select="current-group()"/>
                        </xsl:call-template>


You could do that within the process-data template, or you could do

<xsl:variable name="temp" as="item()">
  <xsl:perform-sort select="current-group()">
    <xsl:sort select="myns:G/myns:sub3/myns:inner" 
data-type="number"/>

and then pass the variable to the template.

Regards,

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

This email and any attachments are only for use by the intended recipient(s) 
and may contain legally privileged, confidential, proprietary or otherwise 
private information.  Any unauthorized use, reproduction, dissemination, 
distribution or other disclosure of the contents of this e-mail or its 
attachments is strictly prohibited.  If you have received this email in error, 
please notify the sender immediately and delete the original.



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>
  • [xsl] RE: Trouble grouping with for-each-group and sort, mlcook <=