Hi Hugh,
Welcome to the list.
If you want to return the Saxon result as-is, you could try to use xslt:transform-text instead of xslt:transform.
I’ll have a closer look at your second attempt next day.
Best, Christian
Hugh Guiney hugh.guiney@gmail.com schrieb am Mi., 1. Aug. 2018, 21:17:
Hello,
First off, loving BaseX so far! Using it as the backend for an API I’m building. However, I’m running into an issue. I’m trying to transform my database XML into an RSS 2.0 feed. It’s mostly working fine, but I can’t output CDATA content at all, which I need to do for `content:encoded` elements.
Specs:
- BaseX 9.0.2 (started via basexserver script)
- Saxon-HE 9.8.0.12J from Saxonica
- java version "1.8.0_112"
- basex 0.9.0 (NodeJS)
- macOS Sierra 10.12.6
### First Attempt
I set `cdata-section-elements` in the XSLT.
rss.xq:
xquery version "3.0"; declare option output:omit-xml-declaration "no"; let $in := <root> <child>hello</child> </root> let $style := doc( 'rss.xslt' ) return xslt:transform( $in, $style )
rss.xslt:
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="3.0" xmlns="http://backend.userland.com/rss2" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:content="http://purl.org/rss/1.0/modules/content/" > <xsl:output omit-xml-declaration="no" cdata-section-elements="content:encoded" /> <xsl:template match="/"> <rss version="2.0"> <content:encoded>hi</content:encoded> <content:encoded><xsl:text>howdy</xsl:text></content:encoded> <content:encoded><xsl:value-of select="//child" /></content:encoded> </rss> </xsl:template> </xsl:transform>
Result:
<?xml version="1.0" encoding="UTF-8"?> <rss xmlns="http://backend.userland.com/rss2" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"> <content:encoded>hi</content:encoded> <content:encoded>howdy</content:encoded> <content:encoded>hello</content:encoded> </rss>
No CDATA sections.
### Second Attempt
I set `cdata-section-elements` in the XQuery.
rss.xq:
xquery version "3.0"; declare namespace content = "http://purl.org/rss/1.0/modules/content/"; declare option output:omit-xml-declaration "no"; declare option output:cdata-section-elements "content:encoded"; let $in := <root> <child>hello</child> </root> let $style := doc( 'rss.xslt' ) return xslt:transform( $in, $style )
rss.xslt: [Unchanged]
Result: [XPST0081] No namespace declared for 'content:encoded'.
Clearly I declared the namespace two lines up.
This looks like a bug to me, but any help appreciated if I’ve missed a step here.
Thanks, Hugh