RE: [xsl] Re: Wrapping problem

Subject: RE: [xsl] Re: Wrapping problem
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 15 Aug 2006 09:48:55 +0100
This solution is likely to be O[n^2] with respect to the number of lines in
the play, which could be rather large. A recursive traversal that uses
apply-templates select="following-sibling::*[1]" would be O[n].

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

> -----Original Message-----
> From: Mukul Gandhi [mailto:gandhi.mukul@xxxxxxxxx] 
> Sent: 15 August 2006 09:31
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Re: Wrapping problem
> 
> Hi Kent,
>    Following is a XSLT 1.0 solution to the problem:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 
> <xsl:output method="xml" indent="yes" />
> 
> <xsl:template match="/play">
>   <play>
>     <xsl:apply-templates select="scene" />
>   </play>
> </xsl:template>
> 
> <xsl:template match="scene">
>   <scene name="{.}">
>     <xsl:apply-templates select="following-sibling::character">
>       <xsl:with-param name="gen-id" select="generate-id()" />
>     </xsl:apply-templates>
>   </scene>
> </xsl:template>
> 
> <xsl:template match="character">
>   <xsl:param name="gen-id" />
> 
>   <xsl:if test="$gen-id = generate-id(preceding-sibling::scene[1])">
>     <character name="{.}">
>       <xsl:apply-templates select="following-sibling::line">
>         <xsl:with-param name="gen-id" select="generate-id()" />
>       </xsl:apply-templates>
>     </character>
>   </xsl:if>
> </xsl:template>
> 
> <xsl:template match="line">
>   <xsl:param name="gen-id" />
> 
>   <xsl:if test="$gen-id = 
> generate-id(preceding-sibling::character[1])">
>     <xsl:copy-of select="." />
>   </xsl:if>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> This stylesheet, when applied to XML:
> 
> <play>
>   <scene>Scene 1</scene>
>   <character>char 1</character>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
>   <character>char 2</character>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
>   <character>char 3</character>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
>   <scene>Scene 2</scene>
>   <character>char 1</character>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
>   <line>blah blah blah</line>
> </play>
> 
> Produces output:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <play>
>    <scene name="Scene 1">
>       <character name="char 1">
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>       </character>
>       <character name="char 2">
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>       </character>
>       <character name="char 3">
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>       </character>
>    </scene>
>    <scene name="Scene 2">
>       <character name="char 1">
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>          <line>blah blah blah</line>
>       </character>
>    </scene>
> </play>
> 
> 
> On 8/14/06, Kent Seegmiller <hookjaw20@xxxxxxxxxxx> wrote:
> > My apologies. for not making that clear.  The following is 
> my input. I 
> > want to wrap a script from a play in a file "movie1.xml":
> > >> <play>
> > >>    <scene>Scene 1</scene>
> > >>       <character>char 1</character>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line>
> > >>       <character>char 2</character>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line>
> > >>       <character>char 3</character>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line>
> > >>    <scene>Scene 2</scene>...
> > >>       <character>char 1</character>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line>
> > >>          <line>blah blah blah</line> ...
> > >> </play>
> >  The output I want to look like so:
> > <play>
> >    <scene name="Scene 1">
> >       <character name="char 1">
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >       </character>
> >       <character name="char 2">
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >       </character>
> >       <character name="char 3">
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >       </character>
> >    </scene>
> >    <scene name="Scene 2">
> >       <character> name="char 1"
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >          <line>blah blah blah</line>
> >       </character>
> >  ...</scene>
> > </play>
> >
> > >> My question: How do I wrap the scenes and characters.  So far my 
> > >> strained brain can only think of creating a text file and using 
> > >> "&lt;scene>" or "&lt;character>" to place the end element then 
> > >> renaming the text file to xml.
> > >> thanks Kent
> 
> --
> Regards,
> Mukul Gandhi
> 
> http://gandhimukul.tripod.com

Current Thread