|
Subject: Re: [xsl] Processing tag text either side of nested tags From: "andrew welch" <andrew.j.welch@xxxxxxxxx> Date: Tue, 11 Apr 2006 15:53:02 +0100 |
On 4/11/06, Neil Crofts <neil.crofts@xxxxxxxxx> 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.
Change your outer template to this:
<!-- Outer template -->
<xsl:template match="outer/text()">
<xsl:call-template name="upper">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:template>
This only calls the upper-case template for the text nodes of <outer>
leaving the identity template to copy the nested <inner> node (which
is pretty much a copy of your last paragraph :)
cheers
andrew
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Processing tag text either si, Neil Crofts | Thread | Re: [xsl] Processing tag text eithe, Jon Gorman |
| [xsl] Processing tag text either si, Neil Crofts | Date | Re: [xsl] Processing tag text eithe, Jon Gorman |
| Month |