xsl-list
[Top] [All Lists]

Re: xsl grouping problem

2005-09-09 09:33:20
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(_at_)ldschurch(_dot_)org> 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?

--~------------------------------------------------------------------
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>