This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Selective output of half a tag?
- From: "Michael Kay" <michael dot h dot kay at ntlworld dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Tue, 11 Jun 2002 15:33:16 +0100
- Subject: RE: [xsl] Selective output of half a tag?
- Reply-to: xsl-list at lists dot mulberrytech dot com
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