Subject: Re: [xsl] Processing tag text either side of nested tags From: "Neil Crofts" <neil.crofts@xxxxxxxxx> Date: Tue, 11 Apr 2006 16:15:52 +0100 |
Thanks to everyone who has responded to my query so far (Andrew, Jon, David and Wendel). I understand the issue now. This has been an area which has been causing me confusion for some time and I think collectively you've all just helped me to the next level of understanding of XSLT. Great work. Thanks also for the warning about the T word :-) Regards, Neil On 11/04/06, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote: > Neil, > > I think the solution to your problem is to match text nodes, but only > the text nodes you want. (Let the built-in template match the others.) > > As in, > > <xsl:template match="outer/text()"> > ... upshift here ... > </xsl:template> > > Since this won't match the text nodes inside the inner, they will be untouched. > > I hope that helps, > Wendell > > At 10:38 AM 4/11/2006, you wrote: > >I have some XML with text contained either side of a nested tag. I > >would like to apply a named template to the text parts such that I > >modify the text but also preserve the nested tags as-is. For example, > >I have some XML of the form: > > > ><outer> hello there <inner name="alpha">beta gamma</inner> goodbye > >then </outer> > > > >...and I need to transform it to the following format: > > > ><outer> HELLO THERE <inner name="alpha">beta gamma</inner> GOODBYE > >THEN </outer> > > > >where in this case a named template converts the text to upper case, > >although ideally the conversion function would be arbitrary. > > > >I have made a number of attempts so far at doing this, but without > >success. For example: > > > > <!-- Identity template --> > > <xsl:template match="@*|node()"> > > <xsl:copy> > > <xsl:apply-templates select="@*|node()"/> > > </xsl:copy> > > </xsl:template> > > > > <!-- Outer template --> > > <xsl:template match="outer"> > > <xsl:copy> > > <xsl:copy-of select="@*"/> > > <xsl:call-template name="upper"> > > <xsl:with-param name="text"> > > <xsl:apply-templates select="node()"/> > > </xsl:with-param> > > </xsl:call-template> > > </xsl:copy> > > </xsl:template> > > > > <!-- Convert text to upper case --> > > <xsl:template name="upper"> > > <xsl:param name="text"/> > > <xsl:value-of select="translate($text, > >'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/> > > </xsl:template> > > > > > >The above results in: > > > ><outer>HELLO THEREBETA GAMMAGOODBYE THEN</outer> > > > >I understand why this is producing that, but I just can't figure out > >how to apply the named template to only the text parts of the <outer> > >tag, while copying the nested <inner> tag as-is. > > > >Thanks in advance for any insight into how to resolve this problem. > > > ====================================================================== > Wendell Piez mailto:wapiez@xxxxxxxxxxxxxxxx > Mulberry Technologies, Inc. http://www.mulberrytech.com > 17 West Jefferson Street Direct Phone: 301/315-9635 > Suite 207 Phone: 301/315-9631 > Rockville, MD 20850 Fax: 301/315-8285 > ---------------------------------------------------------------------- > Mulberry Technologies: A Consultancy Specializing in SGML and XML > ======================================================================
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Processing tag text eithe, Wendell Piez | Thread | [xsl] Finding element name of conte, Ed Yau |
Re: [xsl] Finding element name of c, Wendell Piez | Date | Re: [xsl] Finding element name of c, Jon Gorman |
Month |