RE: [xsl] Grouping problem

Subject: RE: [xsl] Grouping problem
From: "Ruggier, Mario" <Mario.Ruggier@xxxxxxxxxxxxxxxx>
Date: Tue, 23 Jul 2002 16:11:47 +0200
Hello Jeni,

yes it does work, thank you. (Plus, it is 
about twice+ as fast as another less-general 
solution not based on xsl:key).

However I encounter another problem. To apply this
solution I would need to dynamically set up the xsl:key.
I.e. would need to specify something like:

<xsl:key name="PropArrays" 
         match="PROPERTY.ARRAY[@NAME=$displayProperty]" 
         use="VALUE.ARRAY/VALUE[last()-$offset]" />

This presents in fact two problems:
1. msxml3 (imposed) complains that 
   "Variables may not be used within this expression"
   (but Saxon 6.0.2 does not, and behaves as expected
    at least for the first variable).
2. The $offset variable would need to be set from 
   something in the xml data. How can I read some XML
   data, set the variable and use it to set up the key?

mario




> -----Original Message-----
> From: Jeni Tennison [mailto:jeni@xxxxxxxxxxxxxxxx]
> Sent: Monday, July 22, 2002 10:50 PM
> To: Ruggier, Mario
> Cc: xsl-list@xxxxxxxxxxxxxxxxxxxxxx; joerg.heinicke@xxxxxx
> Subject: Re: [xsl] Grouping problem
> 
> 
> Hello Mario,
> 
> > Here's the more complicated version: I would like to convert the
> > list of <obj> elements (see INPUT below) to the hierarchical XML
> > (see OUTPUT below).
> 
> The following works by first applying templates to only those p.array
> elements whose size attribute has the value 1. The template for
> p.array elements has a $others parameter that holds the "other"
> p.array elements that share the same values for their v elements. It
> creates an 'obj' element for the particular level of the p.array
> element that you're applying template to, then applies templates to
> the next level of p.array elements, passing in the next set of
> "others", those that match the next layer of v elements:
> 
> <xsl:key name="arrays" match="p.array" use="v[last()]"/>
> 
> <xsl:template match="r">
>   <xsl:copy>
>     <xsl:apply-templates select="obj/p.array[@size = 1]" />
>   </xsl:copy>
> </xsl:template>
> 
> <xsl:template match="p.array">
>   <xsl:param name="others" select="key('arrays', v[last()])" />
>   <obj name="{v[1]}">
>     <xsl:for-each select="$others[@size = current()/@size + 1]">
>       <xsl:apply-templates select=".">
>         <xsl:with-param name="others"
>           select="$others[v[last() - current()/@size + 1] =
>                           current()/v[1]]" />
>       </xsl:apply-templates>
>     </xsl:for-each>
>   </obj>
> </xsl:template>
> 
> Cheers,
> 
> Jeni
> 
> ---
> Jeni Tennison
> http://www.jenitennison.com/

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread