You can use CDATA inside payload factory mediator. The only thing you need to do is, you need to store the format in registry and use it from there. Registry Resource
Following is a sample. In this sample, I am using the response of my previous call as the input for the message I am preparing with payload factory mediator.
<property xmlns:ns="http://org.apache.synapse/xsd"
name="ALLRESULTS"
expression="$body/child::*[fn:position()=1]"
scope="default"
type="STRING"/>
<payloadFactory media-type="xml">
<format key="conf:/repository/esb/myPF"/>
<args>
<arg evaluator="xml" expression="$ctx:ALLRESULTS"/>
<arg value="1"/>
</args>
</payloadFactory>
The content of the registry resource is as follows.
<ns:testMethod xmlns:ns="http://example.com">
<xs:xmlBody xmlns:xs="http://example.com"><![CDATA[$1]]></xs:xmlBody>
<xs:sessionId xmlns:xs="http://example.com">$2</xs:sessionId>
</ns:testMethod>
With this way, you can use CDATA inside payload factory mediator.