|
Subject: RE: [xsl] XSLT2 grouping over multiple documents From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Thu, 23 Jun 2005 08:47:31 +0100 |
You don't actually need to make copies of all the documents before grouping
them. Just do
<xsl:for-each-group select="document(a/@href)/responses/response"
group-by="@for">
To sort the groups according to the number of correct answers, put an
xsl:sort as the first child of xsl:for-each-group, thus:
<xsl:sort select="count(current-group()[@correct='correct'])"/>
The inner loop:
<xsl:for-each-group select="current-group()"
> group-by="@correct">
> <xsl:value-of select="count(current-group())" />
> </xsl:for-each-group>
is interesting because a selected element doesn't get put in a group if the
grouping key evaluates to an empty sequence. So it seems there will only be
one group coming out of this, the group that has @correct='correct'. So this
loop seems unnecessary, it is equivalent to
<xsl:value-of select="count(current-group()[@correct='correct'])"/>
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Thomas J. Sebestyen [mailto:a9105535@xxxxxxxxxxxxxxxxx]
> Sent: 23 June 2005 00:50
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] XSLT2 grouping over multiple documents
>
> Hello,
>
> I have a couple of xml-documents, all with the same structure:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <responses>
> <response for="js0" correct="correct">C</response>
> <response for="js1">A</response>
> <response for="js2" correct="correct">A</answer>
> <response for="db0" correct="correct">A</response>
> <response for="db1">B</response>
> ...
> </responses>
>
>
> I use an xml-file to collect all this documents:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <alldocs>
> <a href="184855.xml" />
> <a href="190026.xml" />
> ...
> </alldocs>
>
> I woul like to group all <response> by @for over all
> documents and then
> count how many from them has an @correct.
> My solution is the following (which works for me):
>
> <?xml version="1.0" encoding="iso-8859-1"?>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:output method="html" indent="yes" encoding="iso-8859-1" />
> <xsl:template match="/alldocs">
> <xsl:variable name="alldocs">
> <xsl:for-each select="document(a/@href)">
> <xsl:copy-of select="/responses/response" />
> </xsl:for-each>
> </xsl:variable>
> <html>
> <head><title>Responses</title></head>
> <body>
> <xsl:for-each-group select="$alldocs/response"
> group-by="@for">
> <p>
> <b><xsl:value-of select="current-grouping-key()" />=</b>
> <xsl:for-each-group select="current-group()"
> group-by="@correct">
> <xsl:value-of select="count(current-group())" />
> </xsl:for-each-group>
> </p>
> </xsl:for-each-group>
> </body>
> </html>
> </xsl:template>
> </xsl:stylesheet>
>
> Is there a better solution?
> (for exmaple if I would like to sort the output by the number of
> @corrects)
>
> Regards
> Thomas
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] XSLT2 grouping over multiple , Thomas J. Sebestyen | Thread | Re: [xsl] XSLT2 grouping over multi, Thomas J. Sebestyen |
| RE: [xsl] Schema aware transformati, Andrew Welch | Date | Re: [xsl] Linking to a 6 level tag , Kahlil Johnson |
| Month |