Subject: RE : Grouping upon various attribute values
From: <lawrence.michel@xxxxxxx>
Date: Wed, 16 Aug 2006 16:50:10 +0200
|
Well, here are my results:
1. group-by="string-join(gesamtMenge/filter/@*, '|')"
It worked very well, but the ordering issue is still open. In my case, the xml
is computationaly created, and ordering of attributes should be maintained
constantly.
2. group-by="concat(gesamtMenge/filter/@aufAttribut, '|',
gesamtMenge/filter/@typ, '|', gesamtMenge/filter/@wertStruktur...)"
Doesn't solve my problem: I get the "A sequence of more than one item is not
allowed as the first argument of concat()". This might be due to the element
structure of the given nodeset -> the grouping element can contain more than
one child element where the grouping key is applied.
3. group-by="f:all-attributes(gesamtMenge/filter)"
I get the same issue as 2.
4. Nested groups technique :
I think this can not solve my problem, because attribute sequence is variable.
Isn't it?
Thank you for your help
Regards from the "cheesy" land ;-)
Lawrence
-----Message d'origine-----
De : Michael Kay [mailto:mike@xxxxxxxxxxxx]
Envoyi : mercredi, 16. ao{t 2006 15:55
@ : xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Objet : RE: Grouping upon various attribute values
There's no direct support for composite grouping keys in xsl:for-each-group.
The simplest solution is to form the composite key yourself. The following
looks promising:
group-by="string-join(@*, '|')"
but is wrong, because the result depends on attribute order. If you know
what attributes you're interested in, use
group-by="concat(@aufAttribut, '|', @typ, '|', @wertStruktur...)"
Alternatively:
group-by="f:all-attributes(.)"
<xsl:function name="f:all-attributes" as="xs:string">
<xsl:param name="node" as="element()"/>
<xsl:value-of>
<xsl:for-each select="$node/@*">
<xsl:sort select="namespace-uri()"/>
<xsl:sort select="local-name()"/>
<xsl:value-of select="."/>
<xsl:text>|</xsl:text>
</xsl:for-each>
</xsl:value-of>
</xsl:function>
The other approach is nested groups:
<xsl:for-each-group group-by="@aufAttribute">
<xsl:for-each-group select="current-group()" select="@typ">
<xsl:for-each-group select="current-group()" select="@wertStruktur">
...
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: lawrence.michel@xxxxxxx [mailto:lawrence.michel@xxxxxxx]
> Sent: 16 August 2006 14:26
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Grouping upon various attribute values
>
> Hi all,
>
> I have a little problem, which gives me a bit headache at the moment.
> Maybe you could help me solve it :
>
> Here the given XML :
>
> <produktenZumAnalysieren>
> <gesamtMenge>
> <filter aufAttribut="Name_Stat"
> typ="diskret" wertStruktur="baum" wert="BP"/>
> <filter aufAttribut="FrankaturArt"
> typ="diskret" wertStruktur="genau" wert="PP"/>
> </gesamtMenge>
> </produktenZumAnalysieren>
> <produktenZumAnalysieren>
> <gesamtMenge>
> <filter aufAttribut="Name_Stat"
> typ="diskret" wertStruktur="baum" wert="BP"/>
> <filter aufAttribut="FrankaturArt"
> typ="diskret" wertStruktur="genau" wert="PP"/>
> </gesamtMenge>
> </produktenZumAnalysieren>
> <produktenZumAnalysieren>
> <gesamtMenge>
> <filter aufAttribut="Name_Stat"
> typ="diskret" wertStruktur="baum" wert="BP"/>
> <filter aufAttribut="Gewicht"
> typ="interval" wert_Ab="1" wert_Bis="100"/> //<- Careful
> here, there is a new set of attributes
> </gesamtMenge>
> </produktenZumAnalysieren>
>
> As you can see, there are three "gesamtMenge" elements, each
> in its own "ProduktZumAnalysieren" element.
>
> Now, I would like to apply a for-each-group loop on them :
>
> <xsl:for-each-group select="produktenZumAnalysieren"
> group-by="gesamtMenge/filter/@* (KICKME HERE)">
>
> That is, the grouping key isn't doing what I expect: I need
> to have all attributes taken in consideration for grouping
> the required elements. In this example, I should have two
> distinctive groups
>
> Any help would be really greatfull ;-)
>
> Cheers
>
> Lawrence Michel, Bern, Switzerland
| Current Thread |
|
lawrence.michel - 16 Aug 2006 14:50:40 -0000 <=
andrew welch - 16 Aug 2006 13:59:10 -0000
|
|