|
Subject: RE: [xsl] Splitting data into smaller groups for HTML output. From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Mon, 31 Oct 2005 19:36:20 -0000 |
> The way I'm looking to split the items into groups is as follows.
>
> 1 to 5 items - 1 group
> 6 to 10 items - 2 groups
> 11 to 15 items - 3 groups
> 16 - 20 items - 4 groups
> 21 - 25 items - 5 groups
Or to put it another way, the number of groups $n is floor(((count(items)-1)
div 5) + 1)
This still isn't quite a complete spec: if there are 21 items, are your 5
groups of size 5/4/4/4/4, or of size 5/5/5/5/1?
If we assume the latter (because it's easier) then in XSLT 2.0 you end up
with
<xsl:variable name="all-items" select="..."/>
<xsl:variable name="num-groups" select="floor(((count($all-items)-1) div 5)
+ 1)"/>
<xsl:for-each select="1 to $n">
<div>
<xsl:copy-of select="subsequence($items, (. - 1)*5 + 1, 5)"/>
</div>
</xsl:for-each>
In 1.0 it's a bit more convoluted: the equivalent is along the lines
<xsl:variable name="all-items" select="..."/>
<xsl:variable name="num-groups" select="floor(((count($all-items)-1) div 5)
+ 1)"/>
<xsl:for-each select="$all-items[position() <= $n]">
<xsl:variable name="p" select="position()"/>
<div>
<xsl:copy-of select="$items[position() >= ($p - 1)*5 + 1 and
position() <= $p*5)"/>
</div>
</xsl:for-each>
Michael Kay
http://www.saxonica.com/
>
> So the number of groups will in fact depend on the number of <source>
> nodes in the XML file. The <source> nodes will are already in the
> correct order in the XML file so I don't need to sort them in any
> other way in the XSL.
>
> Cheers,
> Mike.
>
>
> On 10/31/05, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote:
> > Mike,
> >
> > The one thing you don't say is by what rule you would like the
> > splitting to occur (you only say "into two or more groups").
> >
> > If you wanted to split into exactly two groups, you could do:
> >
> > <xsl:template match="sources">
> > <div>
> > <xsl:apply-templates
> > select="source[position() <= (last() div 2)"/>
> > </div>
> > <div>
> > <xsl:apply-templates
> > select="source[position() > (last() div 2)"/>
> > </div>
> > </xsl:template>
> >
> > Notice if you have an odd number of source element children, the
> > first group will be short one item.
> >
> > There are other methods available for grouping them differently and
> > even according to data-driven criteria, for example if you need to
> > determine dynamically how many groups you want.
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Splitting data into small, Mike Rumble | Thread | Re: [xsl] Splitting data into small, Mike Rumble |
| RE: [xsl] XSLT 2.0 : Deployment, Michael Kay | Date | RE: [xsl] XSLT 2.0 : Deployment, Agnisys |
| Month |