If we have:
<div> <xsl:value-of select="'<p>contenu</p>'" disable-output-escaping="yes"/> </div>
the following fragment will be produced by xalan (but it's JAXP compliant):
<div> <?javax.xml.transform.disable-output-escaping ?><p>mon contenu</p><?javax.xml.transform.enable-output-escaping ?> </div>
But, the tricky part is that it was hidden because we used xalan from beginning to end which unescape content in the serializer.
So, the solution is to write content inside these processing instructions directly into the output stream (pass through mode) and to filter processing instructions.