|
Subject: RE: [xsl] Nested for-each-group From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 28 Sep 2004 13:10:23 +0100 |
group-starting-with and group-ending-with partition the population: the
first/last item in the population starts/ends a group whether or not it
matches the pattern.
The simplest way to discard the spurious groups in this case is probably to
do
xsl:if test="position()=last()"
in the outer group, and
xsl:if test="position()=1"
in the inner group.
An interesting way of tackling the problem. I think I would have used
"intersect":
<div>
<xsl:value-of select="
sum (
(col[@colname=$s]/(.|following-sibling::col)
intersect
col[@colname=$e]/(.|preceding-sibling::col))/@width)"/>
</div>
Unless I thought about it more carefully (!), in which case I would use a
predicate of the form:
sum(col[. is $S or . is $E or (. >> $S and . << $E)])
Yet another solution:
for $s in index-of(col/@colname, $start),
$e in index-of(col/@colname, $end)
return
sum(subsequence(col/@width, $s, $e - $s + 1)),
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Andrew Welch [mailto:ajwelch@xxxxxxxxxxxxxxx]
> Sent: 28 September 2004 11:38
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Nested for-each-group
>
>
> Hi all,
>
> Given this xml:
>
> <tgroup>
> <col colname="C.HPC" width="17"/>
> <col colname="C.HPB" width="23"/>
> <col colname="C.HPA" width="29"/>
> <col colname="C.I0F" width="17"/>
> <col colname="C.I0E" width="14"/>
> <spanspec namest="C.HPC" nameend="C.I0F"/>
> <spanspec namest="C.HPC" nameend="C.I0E"/>
> </tgroup>
>
> I'm trying to sum the colwidths specified by the spanspecs. I used to
> use a recursive template, which I'm trying to replace using a nested
> for-each-group:
>
> <xsl:template match="spanspec">
> <xsl:variable name="namest" select="@namest"/>
> <xsl:variable name="nameend" select="@nameend"/>
>
> <xsl:for-each-group select="preceding-sibling::col"
> group-starting-with="*[@colname = $namest]">
> <xsl:for-each-group select="current-group()"
> group-ending-with="*[@colname = $nameend]">
> <div><xsl:value-of
> select="sum(current-group()/@width)"/></div>
> </xsl:for-each-group>
> </xsl:for-each-group>
>
> </xsl:template>
>
> However, this produces:
>
> <div>86</div><div>14</div>
> <div>100</div>
>
> I don't understand why I'm getting the "<div>14</div>" output? I know
> it's part of the outer group, but it shouldn't be part of the inner
> group. Any ideas why its there?
>
> cheers
> andrew
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Nested for-each-group, Andrew Welch | Thread | RE: [xsl] Nested for-each-group, Andrew Welch |
| RE: [xsl] Re: up-converting, Jim_Albright | Date | RE: [xsl] Nested for-each-group, Andrew Welch |
| Month |