Altova Mailing List Archives
>xsl-list Archive Home
>Thread Prev -
>Thread Next - Re: [xsl] Processing tag text either side of nested tags
[xsl] Processing tag text either side of nested tags
Date: 4/11/2006 2:39:00 PM
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.