Hi Graydon,
I can’t say much about serialization in XSLT, but the serialization of
CDATA sections in XQuery is indeed focused on text nodes [1]:
“The cdata-section-elements parameter contains a list of expanded
QNames. If the expanded QName of the parent of a text node is a member
of the list, then the text node MUST be output as a CDATA section,
[…].”
If you want to serialize the descendants of specific elements as text,
you could try this:
declare option output:method 'xml';
declare option output:cdata-section-elements 'div';
let $test := <root>
<content>
<div>words <b>bold</b> words</div>
</content>
</root>
return $test update {
.//div ! (replace value of node . with serialize(node()))
}
Hope this helps,
Christian
[1] https://www.w3.org/TR/xslt-xquery-serialization-31/#XML_CDATA-SECTION-ELEMENTS
On Wed, Aug 26, 2020 at 11:00 PM Graydon Saunders <graydonish@gmail.com> wrote:
>
> 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