Dave,
Erm... my point was that if you were processing the group as a whole
then you could use the position() function to get you the position of
the <loc> within the group. Something like:
<xsl:for-each-group select="loc" group-by="@hl">
<xsl:for-each-group select="current-group()" group-by="@side">
<xsl:for-each-group select="current-group()" group-by="@pos">
Ah!
That's clearer. I've just been fighting group-by="concat...
which fails :-)
Oh? It shouldn't fail -- you should be able to do:
<xsl:for-each-group select="loc"
group-by="concat(@hl, '+', @side, '+', @pos)">
...
</xsl:for-each-group>
instead of the nesting above, just like you would in the use attribute
of <xsl:key> in 1.0.
Or you can do:
<xsl:for-each-group select="loc"
group-by="string-join((@hl, @side, @pos), '+')">
...
</xsl:for-each-group>
The reason that I didn't use it in the example is that (a) using
concat() is ugly (and string-join() only marginally less so),
particularly because you have to come up with a suitable separator for
the values that you want to include in the grouping key and (b) if
your attributes were typed (e.g. @pos as an xs:integer) then using
separate <xsl:for-each-group>s gives you datatype-aware grouping,
whereas using concat() or string-join() won't unless you are careful.
(I can't believe that no one apart from me is bothered about having
to nest <xsl:for-each-group> as in the above when you want to group
by several things at once.)
Is this a starter for ten for Jeni's own equivalent of Muenchian
techniques?
I would personally prefer something like:
<xsl:for-each select="loc">
<xsl:group by="@hl" />
<xsl:group by="@side" />
<xsl:group by="@pos" />
...
</xsl:for-each>
but I've suggested it before and no one else seems to think it's worth
changing.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list