xsl-list
[Top] [All Lists]

RE: Nested for-each-group

2004-09-28 05:10:23
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[(_at_)colname=$s]/(.|following-sibling::col)
               intersect
       col[(_at_)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(_at_)piper-group(_dot_)com] 
Sent: 28 September 2004 11:38
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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="*[(_at_)colname = $namest]">
        <xsl:for-each-group select="current-group()"
group-ending-with="*[(_at_)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

--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--





<Prev in Thread] Current Thread [Next in Thread>