This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: Selective output of half a tag?


You need to learn about grouping; start by reading
http://www.jenitennison.com/xslt/grouping.

Michael Kay
Software AG
home: Michael.H.Kay@ntlworld.com
work: Michael.Kay@softwareag.com 

> -----Original Message-----
> From: owner-xsl-list@lists.mulberrytech.com 
> [mailto:owner-xsl-list@lists.mulberrytech.com] On Behalf Of 
> Graham Ashton
> Sent: 11 June 2002 13:57
> To: xsl-list
> Subject: Re: [xsl] Selective output of half a tag?
> 
> 
> On Tue, 2002-06-11 at 12:20, Peter Davis wrote:
> > On Tuesday 11 June 2002 03:50, Graham Ashton wrote:
> > > <xsl:if test="self::foo">
> > >       <mytag>
> > >     </xsl:if>
> > >     <xsl:apply-templates/>
> > >     <xsl:if test="count(following-sibling::foo)=0">
> > >       </mytag>
> > >     </xsl:if>
> > 
> > Yes, that doesn't work because it is not well-formed.
> 
> Thanks very much for the reply.
> 
> > If all you need to do is dynamically change the name of the 
> tag, then
> > <xsl:element> can help you out...
> 
> I don't think that will do it, because what I'm trying to do 
> (but failed to explain properly) above is to take a series of 
> <foo/> tags in the source, convert them all to <bar/> in the 
> output, and then wrap the group of <bar/> up in <mytag/>.
> 
> So,
> 
>   <foo/>
>   <foo/>
> 
> becomes
> 
>   <mytag>
>     <bar/>
>     <bar/>
>   </mytag>
> 
> Hence the need to determine if a <foo/> is the last in the 
> group of <foo/>'s, so it can append a </mytag>.
> 
> To complicate things, each <foo/> tag will contain quite a 
> few tags that will themselves be converted into other types 
> of tag, which is why I need to call <xsl:apply-templates/>.
> 
> > If you need to selectively output or not output the entire 
> tag, then 
> > you need
> > something like this:
> > 
> > <xsl:choose>
> >   <xsl:when test="something">
> >     <mytag>
> >       <xsl:apply-templates/>
> >     </mytag>
> >   </xsl:when>
> >   <xsl:otherwise>
> >     <xsl:apply-templates/>
> >   </xsl:otherwise>
> > </xsl:choose>
> > 
> > As you might notice, the above basically has two possible 
> outputs, and 
> > each
> > choice has its own copy of <xsl:apply-templates/>.  You've 
> already done the 
> > hard part of putting the common code in (an)other 
> template(s).  If what you 
> > had was more than a single command inside of <mytag/>, then 
> you would 
> > probably want to move the common code to a named template 
> and only copy the 
> > <xsl:call-template/> inside <mytag/> and <xsl:otherwise/>.
> 
> To pursue that path suggests to me that I would need to come 
> up with a single template that (when called for the first 
> <foo/> tag) would output all the <foo/> tags at once. I'm not 
> sure how to do that.
> 
> I've got Michael Kay's "XSLT Ref, 2nd Ed.", and it talks 
> about the disable-output-escaping option (thanks for putting 
> me onto it).
> 
> > The final and most despised option is 
> disable-output-escaping.  This 
> > is the
> > lazy way out, but it follows your idea of telling the 
> processor to treat 
> > "<mytag>" as text.
> 
> From XSLT Ref (pg 327):
> 
>     With a bit of thought you can usually find a way to achieve the
>     output you want without resorting to such devices.
> 
> I'd really like to do it the right way, but haven't managed 
> to work out what that is yet.... so I'm going to go with 
> disable-output-escaping in the mean time, much as I hate the 
> cheap way out.
> 
> Thanks again.
> 
> -- 
> Graham Ashton
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]