Using 9.4.2 and 943-20200826.181852 I get the same result: let $test as element(root) := <root> <content> <div>words</div> </content> </root> return file:write('/home/graydon/test2.xml', $test, map { "method": "xml", "cdata-section-elements": "content"}) does not work, in the sense that no CDATA block is created. let $test as element(root) := <root> <content> <div>words</div> </content> </root> return file:write('/home/graydon/test2.xml', $test, map { "method": "xml", "cdata-section-elements": "div"}) does work, in the sense that the text contents of div gets wrapped in CDATA. If I try let $test as element(root) := <root> <content> <div>words <b>bold</b> words</div> </content> </root> return file:write('/home/graydon/test2.xml', $test, map { "method": "xml", "cdata-section-elements": "div"}) I get <root> <content> <div><![CDATA[words ]]><b>bold</b><![CDATA[ words]]></div> </content> </root> which makes me think that only text node children of the element get wrapped in a CDATA block. I would expect (from the way XSLT processors usually behave) that the content of an element with element children would be serialized into a CDATA block. Am I confused? Is this a bug? is there a more appropriate way to declare the contents of the content element a CDATA block? Thanks! Graydon