xsl-list
[Top] [All Lists]

RE: Need to wrap XML in <![CDATA[...]]> tags

2003-08-04 10:50:46
Your solution would work if you were using an XSLT processor that
supported disable-output-escaping. It seems you aren't. The fact that
d-o-e is non-portable is one of the reasons we often give for avoiding
it.

Another approach might be to use saxon:serialize(), or an equivalent
home-grown extension function of your own.

Best solution would be to find the person who designed this XML
structure and get them to mend their ways. Or you could devise a
sanitary XML representation of the data, generate that, and then
postprocess it using non-XSLT techniques (e.g. change <cdata>...</cdata>
to
<![CDATA[...]]> using a text editor).

Michael Kay

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Jason Cunningham
Sent: 04 August 2003 15:19
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Need to wrap XML in <![CDATA[...]]> tags


Hi,

I've got a strange requirement to transform

<sample>
  <name>
    <firstName>Mickey</firstName>
    <lastName>Mouse</lastName>
  </name>
</sample>

into

<sample>
  <person>
    <![CDATA[
      <name>
        <firstName>Mickey</firstName>
        <lastName>Mouse</lastName>
      </name>
    ]]>
  </person>
</sample>

I've written this XSL

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match='*[name() = "sample"]'>
    <sample>
      <person>
        <xsl:text disable-output-escaping="yes">
          &lt;![CDATA[
        </xsl:text>
        <xsl:copy-of select="./node()"/>
        <xsl:text disable-output-escaping="yes">
          ]]&gt;
        </xsl:text>
      </person>
    </sample>
  </xsl:template>

</xsl:stylesheet>

that gets me to

<sample>
  <person>
    &lt;![CDATA[
      <name>
        <firstName>Mickey</firstName>
        <lastName>Mouse</lastName>
      </name>
    ]]&gt;
  </person>
</sample>

Unfortunately, this isn't good enough, for the system I am 
interfacing with. 
  I can not figure out how I can insert an unescapted '<' 
into the output - 
I've read that '<' isn't allowed inside the xsl:text tag.

Has anyone any ideas?

Thanks for your time,

Jason

_________________________________________________________________
Find a cheaper internet access deal - choose one to suit you. 
http://www.msn.co.uk/internetaccess


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



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



<Prev in Thread] Current Thread [Next in Thread>