Re: [xsl] Grouping

Subject: Re: [xsl] Grouping
From: Ragulf Pickaxe <ragulf.pickaxe@xxxxxxxxx>
Date: Wed, 7 Dec 2005 10:25:11 +0100
Hi prakash,

>  <xsl:output method="xml"/>
>
> <xsl:key name="rec" match="row" use="question_id"/>
>
> <xsl:template match="/recordset">
>
> <xsl:for-each select="row">
> <xsl:if test="generate-id(.) = generate-id(key('rec', question_id))">
> <xsl:text>
> </xsl:text>
> Answers for question <xsl:value-of select="question_id"/>
> </xsl:if>
> <xsl:text>
> </xsl:text>
>
> <xsl:value-of select="key('rec', question_id)/answer"/>
> <xsl:text>
> </xsl:text>
>
> </xsl:for-each>
>
>  </xsl:template>

Will you not have a problem here, if question_id are not ordered?
As I read it, you go through all row elements. You check if the value
of question_id is the first of its kind, and if it is, you write the
Answers to question...
Then you proceed to write the value of the answer element.
As I see it, <xsl:value-of select="key('rec', question_id)/answer"/>
is the same as <xsl:value-of select="answer"/>, and as you have not
made sure of the value of question_id in your for-each, then this can
be wrong.

If I have not understood this correctly, please correct me.

A key approach, I would use (modifying your template):

<xsl:for-each select="row[generate-id(.) = generate-id(key('rec',
question_id))]">
Answers for question <xsl:value-of select="question_id"/>
<xsl:text>
</xsl:text>
<xsl:for-each select="key('rec', question_id)/answer">
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>

This one will work no matter the order of question_id's.

Regards,
Ragulf Pickaxe :-)

Current Thread