RE: [xsl] Grouping Problems XSLT2.0

Subject: RE: [xsl] Grouping Problems XSLT2.0
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 14 Mar 2007 11:23:39 -0000
It looks to me like

<xsl:for-each-group select="para"
group-starting-with="*[class='epigraphpara' or (class='subsection1para' and
inline)]">

(then having done hte grouping you need to inspect the first element of each
group to see what element to output)

Michael Kay
http://www.saxonica.com/  

> -----Original Message-----
> From: Jeff Sese [mailto:jsese@xxxxxxxxxxxx] 
> Sent: 14 March 2007 09:47
> To: Xsl-List
> Subject: [xsl] Grouping Problems XSLT2.0
> 
> Hi,
> 
> I have this flat structure:
> 
> <section>
>     <para class="epigraphpara">...</para>
>     <para class="epigraphpara">...</para>
>     <para class="epigraphpara">...</para>
>     <para class="epigraphpara">...</para>
>     <para class="epigraphsource">...</para>
>     <para class="subsection1para"><inline 
> class="subsection1title">...</inline></para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para"><inline 
> class="subsection1title">...</inline></para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
>     <para class="subsection1para">...</para>
> </section>
> 
> How can I achieve this using xsl:for-each-group:
> 
> <section>
>     <epigraph>
>         <para class="epigraphpara">...</para>
>         <para class="epigraphpara">...</para>
>         <para class="epigraphpara">...</para>
>         <para class="epigraphpara">...</para>
>         <para class="epigraphsource">...</para>
>     </epigraph>
>     <subsection1>
>         <title><para class="subsection1para"><inline 
> class="subsection1title">...</inline></para></title>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>     </subsection1>
>     <subsection1>
>         <title><para class="subsection1para"><inline 
> class="subsection1title">...</inline></para></title>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>         <para class="subsection1para">...</para>
>     </subsection1>
> </section>
> 
> I must group para[@class=("epigraphpara", "epigraphsource")] 
> into an <epigraph> element. The para[@class="epigraphsource"] 
> can either appear 1st or last. The 
> para[@class="subsection1para"] must be group for every 
> para[@class="subsection1para"][child::inline[@class="subsectio
> n1title"]].
> 
> I have this template so far:
> 
> <template match="section">
>     <xsl:for-each-group select="node()" group-adjacent="@class">
>        <xsl:choose>
>           <xsl:when test="current-grouping-key() eq 'epigraphpara'">
>              <epigraph>
>                 <xsl:apply-templates select="current-group()"/>
>              </epigraph>
>           </xsl:when>
>           <xsl:otherwise>
>                <xsl:apply-templates select="current-group()"/>
>           </xsl:otherwise>
>        </xsl:choose>
>     </xsl:for-each-group>
> </template>
> 
> And I'm stuck at this point cause I don't know how can I 
> include the other elements. Hope someone can give me ideas on 
> how to work this out.
> 
> TIA!
> 
> -- Jeff

Current Thread