Раздел CDATA не сохраняется в XML INFOSET , поэтому его содержимое представляет собой обычный текст - полный текстовый узел или часть текстового узла.
В вашем случае секция CDATA является полным текстовым узлом, поэтому вы можете иметь :
<xsl:template match="property[string='someEscapedText']">
<string>newEscapedValue</string>
</xsl:template>
Вам не нужно использовать DOE или CDATA - просто экранируйте символы в NewValue и используйте атрибут cdata-section-elements="string"
декларации <xsl:output>
.
А вот и полное решение :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output cdata-section-elements="string"
omit-xml-declaration="yes" indent="yes"/>
<xsl:template match=
"property[string='<p>Hello, World</p>']">
<string><p>Hello, You</p></string>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML :
<property>
<string><![CDATA[<p>Hello, World</p>]]></string>
</property>
желаемый, правильный результат получается :
<string><![CDATA[<p>Hello, You</p>]]></string>