RE: [xsl] output CDATA in xml using xsl

Subject: RE: [xsl] output CDATA in xml using xsl
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Sun, 21 Dec 2003 22:40:37 -0000
> Hello
> I am trying to make a xsl document that converts one xml 
> document into 
> another, but  have run into some trouble.
> I have this document:
> <ads>
> <ad>
>    <hello>world</hello>
>    <paragraph>Some <bold>html</bold> formatted text</paragraph>
>    <paragraph>Another line of <bold>html</bold></paragraph> 
> </ad> </ads>
> 
> And I want this out:
> <ads>
> <ad>
>    <hello>world</hello>
>    <htmlcontent>
>    <![CDATA[
>        <p>Som Some <b>html</b> formatted text<p>
>        <p>Another line of <b>html</b></p>
>    ]]>
>    </htmlcontent>
> </ad>
> </ads>
> 
> I have tried setting <xsl:output 
> cdata-section-elements="htmlcontent"> 
> but that did not help me?

This transformation is difficult, because it breaks the "tree-to-tree"
processing model of XSLT. The things in the CDATA that look like tags
(for example <p>) are not actually tags; in fact the very purpose of the
CDATA section is to say "even though it looks like a tag, it isn't one
really".

In Saxon you can use the saxon:serialize() extension function which
turns a tree into a string containing serialized XML, and you can then
output this string in a CDATA section. With other processors you might
be able to write an extension function that achieves a similar effect.

However, since XSLT is about transforming trees and you are working
outside this model, it may be easier (and architecturally cleaner) to
use a text-processing tool (e.g. sed or Perl) to post-process the
output. This might be as simple as replacing "<htmlcontent>" by
"<htmlcontent><![CDATA[" and "</htmlcontent>" by ">>]</htmlcontent>".

Generally I agree with the view that putting markup inside CDATA
sections is not good XML design, but it's often done and some people
come up with plausible reasons why they've done it.

Michael Kay


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


Current Thread