Re: [xsl] position behavior in nested grouping

Subject: Re: [xsl] position behavior in nested grouping
From: Ganesh Babu N <nbabuganesh@xxxxxxxxx>
Date: Thu, 30 Jul 2009 18:09:46 +0530
Hai,

the code is working fine for this input. But If you have empty col[2].
It is not working. Please refer new input below:

Old Input
======
<articles>
     <row>
        <col>627</col>
        <col>Abstracts of the Series of Fascia Congress - Part 4</col>
        <col>270</col>
     </row>
     <row>
        <col>661</col>
        <col>Abstracts of the Series of Fascia Congress - Part 4</col>
        <col>270</col>
     </row>
     <row>
        <col>676</col>
        <col>Abstracts of the Series of Fascia Congress - Part 4</col>
        <col>271</col>
     </row>
     <row>
        <col>719</col>
        <col>Abstracts of the Series of Fascia Congress - Part 4</col>
        <col>272</col>
     </row>
     <row>
        <col>706</col>
        <col>Prevention &amp; Rehabilitation|Editorial</col>
        <col>276</col>
     </row>
     <row>
        <col>690</col>
        <col>Prevention &amp; Rehabilitation|Editorial</col>
        <col>283</col>
     </row>
     <row>
        <col>721</col>
        <col>Prevention &amp; Rehabilitation|Learning Methodology</col>
        <col>291</col>
     </row>
  </articles>

New Input:

<articles>
     <row>
        <col>627</col>
        <col>Abstracts of the Series of Fascia Congress - Part 4</col>
        <col>270</col>
     </row>
     <row>
        <col>661</col>
        <col/>
        <col>270</col>
     </row>
     <row>
        <col>676</col>
        <col/>
        <col>271</col>
     </row>
     <row>
        <col>719</col>
        <col>Abstracts of the Series of Fascia Congress - Part 4</col>
        <col>272</col>
     </row>
     <row>
        <col>706</col>
        <col>Prevention &amp; Rehabilitation|Editorial</col>
        <col>276</col>
     </row>
     <row>
        <col>690</col>
        <col>Prevention &amp; Rehabilitation|Editorial</col>
        <col>283</col>
     </row>
     <row>
        <col>721</col>
        <col>Prevention &amp; Rehabilitation|Learning Methodology</col>
        <col>291</col>
     </row>
  </articles>

I am unable to provide two values in group-by attribute. Please
suggest how to achieve this.

Regards,
Ganesh



On Wed, Jul 15, 2009 at 6:20 PM, Martin Honnen<Martin.Honnen@xxxxxx> wrote:
> Ganesh Babu N wrote:
>
>> I need to find out the starting group or group[1] in the inner loop so
>> that i can append <section-head> to that.
>>
>> binding a variable in outer loop is giving the group position with
>> respect to outer loop. But I need the position with respect to inner
>> loop.
>
> I think you need to reorganize your grouping code to achieve the output you
> want. Try whether the following does what you want:
>
> <xsl:stylesheet
>  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>  version="2.0">
>
>  <xsl:output indent="yes"/>
>
>  <xsl:template match="articles">
>    <sections>
>      <section-title>Contents</section-title>
>      <xsl:for-each-group select="row" group-by="tokenize(col[2], '\|')[1]">
>        <xsl:choose>
>          <xsl:when test="contains(col[2], '|')">
>            <xsl:variable name="outer-key" select="current-grouping-key()"/>
>            <xsl:for-each-group select="current-group()"
> group-by="tokenize(col[2], '\|')[2]">
>              <section>
>                <xsl:if test="position() eq 1">
>                  <section-head><xsl:value-of
> select="$outer-key"/></section-head>
>                </xsl:if>
>                <section-subhead><xsl:value-of
> select="current-grouping-key()"/></section-subhead>
>                <xsl:apply-templates select="current-group()"/>
>              </section>
>            </xsl:for-each-group>
>          </xsl:when>
>          <xsl:otherwise>
>            <section>
>              <section-head><xsl:value-of
> select="current-grouping-key()"/></section-head>
>              <xsl:apply-templates select="current-group()"/>
>            </section>
>          </xsl:otherwise>
>        </xsl:choose>
>      </xsl:for-each-group>
>    </sections>
>  </xsl:template>
>
>  <xsl:template match="row">
>    <para>
>      <page><xsl:value-of select="col[3]"/></page>
>    </para>
>  </xsl:template>
> </xsl:stylesheet>
>
> In your original stylesheet you end up with three groups in the outer
> grouping and then the inner grouping simply has only one group for each of
> the (last two) groups in the outer grouping.
>
>
> --
>
>        Martin Honnen
>        http://msmvps.com/blogs/martin_honnen/

Current Thread