Re: [xsl] xsl grouping problem

Subject: Re: [xsl] xsl grouping problem
From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx>
Date: Fri, 9 Sep 2005 22:03:20 +0530
You could try this XSLT 1.0 solution(though this is tested with Saxon 8.4).

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">

<xsl:output method="xml" indent="yes" />

<xsl:template match="/chapter">
   <chapter>
     <xsl:for-each select="*">
       <xsl:choose>
         <xsl:when test="self::para">
           <xsl:copy-of select="." />
         </xsl:when>
         <xsl:when test="self::line_first">
            <stanza>
	<xsl:call-template name="makegroup">
	   <xsl:with-param name="nodeset" select="self::line_first |
following-sibling::*" />
	</xsl:call-template>
           </stanza>
         </xsl:when>
       </xsl:choose>
     </xsl:for-each>
   </chapter>
</xsl:template>

<xsl:template name="makegroup">
   <xsl:param name="nodeset" />

   <xsl:choose>
     <xsl:when test="$nodeset[1]/self::line_last">
       <xsl:copy-of select="$nodeset[1]" />
     </xsl:when>
     <xsl:otherwise>
       <xsl:copy-of select="$nodeset[1]" />
       <xsl:call-template name="makegroup">
         <xsl:with-param name="nodeset" select="$nodeset[position() &gt; 1]"
/>
       </xsl:call-template>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

On 9/9/05, Jeff Hatch <hatchjk@xxxxxxxxxxxxx> wrote:
> I've been chewing on this for some time now and would love some
suggestions.
> Coming from a document-centric environment, I am given xml that looks like
this:
>
> <chapter>
> <para>This is a paragraph in the chapter</para>
> <line_first>This is first line of a stanza of poetry</line_first>
> <line>This is line of poetry</line>
> <line>This is line of poetry</line>
> <line>This is line of poetry</line>
> <line_last>This is last line of a stanza of poetry</line_last>
> <para>This is a paragraph in the chapter</para>
> </chapter>
>
> The challenge is to perform copy and grouping operations to a) copy all
existing
> structure as is, using copy-of, which is not a problem. However, to the
above
> xml I wish to apply additional structure to create a poem stanza:
>
> <chapter>
> <para>This is a paragraph in the chapter</para>
> <stanza>
> <line_first>This is first line of poetry</line_first>
> <line>This is line of poetry</line>
> <line>This is line of poetry</line>
> <line>This is line of poetry</line>
> <line_last>This is last line of poetry</line_last>
> </stanza>
> <para>This is a paragraph in the chapter</para>
> </chapter>
>
> My difficulty stems from being dealt two dissimilar element names at the
> beginning and end of the block of xml that needs to be grouped. My attempts
to
> do this with group-starting-with and group-ending-with have failed.
Performing
> group-adjacent on the <line> elements miss the first_ and last_line
elements.
> Any thoughts?

Current Thread