Thanks Jeni, The stylesheet now works for me in Xalan, Saxon, MSXML and the
XML Spy XSLT engine:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="CDATABegin" select="'<![CDATA['" />
<xsl:variable name="CDATAEnd" select="']]>'" />
<!-- process all nodes except text nodes -->
<xsl:template match="*|@*">
<xsl:copy>
<!-- process all attributes and child nodes -->
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- process text nodes -->
<xsl:template match="text()">
<xsl:value-of select="$CDATABegin"
disable-output-escaping="yes"/>
<xsl:value-of select="." disable-output-escaping="yes"/>
<xsl:value-of select="$CDATAEnd"
disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>