|
Subject: Re: [xsl] Group elements based on summing values (XSL 1.0) From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 6 Feb 2015 11:43:30 -0000 |
It's not an easy problem. Whether in 1.0 or 2.0 you need to use sibling
recursion. The basic structure is: write a template that matches <num>
elements and that calls itself recursively to process the immediately
following sibling element, passing the accumulated total as a parameter.
Within the template, the recursive call to process the next element goes
inside a <group> element if there's room for more entries, or outside the
group element if not: something like
<xsl:template match="num">
<xsl:param name="total-so-far"/>
<xsl:choose>
<xsl:when test="$total-so-far < 10">
<xsl:copy-of select="."/>
<xsl:apply-templates select="following-sibling::num[1]">
<xsl:with-param name="total-so-far" select="$total-so-far + num"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<group>
<xsl:copy-of select="."/>
<xsl:apply-templates select="following-sibling::num[1]">
<xsl:with-param name="total-so-far" select="0"/>
</xsl:apply-templates>
</group>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
You kick it off with
<xsl:template match="row">
<xsl:apply-templates select="num[1]">
<xsl:with-param name="total-so-far" select="0"/>
I may not have got that exactly right, but you get the idea.
Michael Kay
Saxonica
mike@xxxxxxxxxxxx
+44 (0) 118 946 5893
On 6 Feb 2015, at 10:44, Kevin Bird kevinbrianbird@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> Hello,
>
> My XSL skills are a bit rusty.
>
> Starting from the first <num> element, I need to create the smallest group
> possible where the sum of the <num> elements totals 10 or more. I am only
> able to use XSL 1.0.
>
> INPUT:
> <row>
> <num>3</num>
> <num>4</num>
> <num>4</num>
> <num>7</num>
> <num>12</num>
> <num>15</num>
> <num>1</num>
> </row>
>
> OUTPUT:
> <row>
> <group1>
> <num>3</num>
> <num>4</num>
> <num>4</num>
> </group1>
> <group2>
> <num>7</num>
> <num>12</num>
> <num>15</num>
> <num>1</num>
> </group2>
> </row>
>
> Any help/pointers appreciated.
>
> --
> Kevin
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Group elements based on s, Ihe Onwuka ihe.onwuk | Thread | Re: [xsl] Group elements based on s, Kevin Bird kevinbria |
| Re: [xsl] Group elements based on s, Ihe Onwuka ihe.onwuk | Date | Re: [xsl] Group elements based on s, Kevin Bird kevinbria |
| Month |