RE: [xsl] processing following-siblings to a point

Subject: RE: [xsl] processing following-siblings to a point
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 10 Jul 2009 00:15:20 +0100
> I've run into a structure that I must transform that I just 
> haven't found a solution for. XSL 1.0 only. (I just don't 
> have the proficiency for 2.0 yet).

I think you've got that the wrong way around. With positional grouping in
XSLT 2.0 (<xsl:for-each-group group-starting-with="title">) this is quite an
easy problem. In XSLT 1.0 you need to write recursive templates, which
requires a much higher level of proficiency in the language.

Regards,

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


> 
> I'm transforming what was a rather flat SGML structure to an 
> XML structure.  Here's the input structure:
> 
> <gen>
> <title>TITLE_1</title>
> <subtitle>SUBTITLE_1</subtitle>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> <title>TITLE_2</title>
> <subtitle>SUBTITLE_2</subtitle>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> <title>TITLE_2</title>
> <subtitle>SUBTITLE_2</subtitle>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> </gen>
> 
> Resulting structure tree:
> 
> <para0>
> <title>TITLE_1</title>
> <subpara1>
> <title>SUBTITLE_1</title>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> </subpara1>
> </para0>
> <para0>
> <title>TITLE_2</title>
> <subpara1>
> <title>SUBTITLE_2</title>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> </subpara1>
> </para0>
> <para0>
> <title>TITLE_3</title>
> <subpara1>
> <title>SUBTITLE_3</title>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> <para>Text.</para>
> </subpara1>
> </para0>
> 
> My template (or at least the important part).
> 
>     <xsl:template match="gen/title" mode="move">
> 
>         <para0>
>             <title>
>                 <xsl:value-of select="."/>
>             </title>
>             <subpara1>
>                 <title><xsl:value-of 
> select="following-sibling::subtitle[1]"/></title>
>                 <xsl:apply-templates 
> select="following-sibling::para"/>
>             </subpara1>
>         </para0>
> 
> My problem is with the <xsl:apply-templates 
> select="following-sibling::para"/> line. Of course, all of 
> the para elements are following siblings of all the gen/title 
> elements. How can I express the <apply-templates> to process 
> only the para element siblings BEFORE the next following 
> title sibling. (This is difficult because EVERYTHING is a 
> sibling of everything else).
> 
> Charles Flanders
> IETM Developer

Current Thread