Вы можете даже избежать экранирующих символов (когда собственно XML узлов в CDATA блоков!), Применяя следующее:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:dt="http://exslt.org/dates-and-times"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="dt exsl">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>
, который при нанесении на
<?xml version="1.0" encoding="UTF-8"?>
<mymessage><![CDATA[<xyz>1234</xyz>]]></mymessage>
дает
<?xml version="1.0" encoding="utf-8"?>
<mymessage><xyz>1234</xyz></mymessage>
В общем, конечно, это не рекомендуется (блок CDATA был помещен там по причине), так что лучше оставить его текст соответствующий шаблон(). В этом случае результат будет
<?xml version="1.0" encoding="utf-8"?>
<mymessage><xyz>1234</xyz></mymessage>
Кажется, что вы не видите '' '' 'mymessage'. Почему вы все равно хотите это сделать? Большинство людей с подобным запросом склонны пренебрегать разбитыми синтаксическими анализаторами XML (в этом случае правильным решением является исправить парсер вместо этого). – Quentin