Hi Vincent,
I understand, but did you see the details of my second attempt? The serialization controls didn’t work when specified in XQuery either. Which they should have, right? I mean, why else would BaseX provide XSLT options like `output:omit-xml-declaration` if you’re not supposed to use them? And why do the same serialization options in XQuery work in BaseX 8 but not BaseX 9? If I was to do further manipulation of the XSLT output in XQuery instead of just immediately sending it to the browser or saving it to a file, why would I want the result to come back as an escaped string instead of real nodes?
My first attempt may have been the wrong approach for what I wanted to do—in which case I would suggest a note in the documentation, since it isn’t obvious compared to the usual method of specifying `xsl:output`—but my second attempt gives me an error for “not declaring a namespace” that I have clearly declared. That seems like a bug, no?
- Hugh
On Wed, Aug 1, 2018 at 9:57 PM, Lizzi, Vincent Vincent.Lizzi@taylorandfrancis.com wrote:
Hugh,
As Gerrit mentioned, the issue you have encountered is due to the xslt:transform function returning, essentially, a parsed XML document, so the serialization controls that are declared in the XSLT are not being used. If you want the serialized output of the XSLT you can use the xslt:transform-text function. For example:
let $in := <root><child>hello</child></root>
let $xslt := doc('rss.xslt')
let $out := xslt:transform-text($in, $xslt)
return file:write-text('out.xml', $out)
I hope this helps.
Vincent
http://docs.basex.org/wiki/XSLT_Module#xslt:transform-text
http://docs.basex.org/wiki/File_Module#file:write-text
From: BaseX-Talk basex-talk-bounces@mailman.uni-konstanz.de on behalf of Hugh Guiney hugh.guiney@gmail.com Sent: Wednesday, August 1, 2018 5:47:55 PM To: Imsieke, Gerrit, le-tex Cc: basex-talk@mailman.uni-konstanz.de Subject: Re: [basex-talk] Can't get `cdata-section-elements` to work at all for XSLT output
Thanks for testing Gerrit, that's good to know. Sounds like a regression then. Shall I go ahead and file this on Github or does it need further confirmation?
Christian, your suggestion seems to work around the issue; the CDATA sections do come in that way. Except, all the elements get sent back entity-escaped for some reason. I have to manually reverse it back into XML using `result.replace( />/gi, '>' ).replace( /</gi, '<' )` in JavaScript. Not sure if that is a separate issue or expected behavior.
On Wed, Aug 1, 2018 at 2:50 PM, Imsieke, Gerrit, le-tex gerrit.imsieke@le-tex.de wrote:
Hi Hugh,
The second version where you specify the serialization options in XQuery works for me (BaseX GUI 8.6.5 with Saxon PE 9.6.0.7:
<?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<![CDATA[hi]]></content:encoded> content:encoded<![CDATA[howdy]]></content:encoded> content:encoded/
</rss>
The first version cannot generate CDATA sections since the XSLT processor is not serializing anything; it’s the XQuery processor that serializes the result.
The error that you are seeing, XPST0081, would be generated if there were no namespace declaration for the prefix 'content', maybe caused by an indistinguishable look-alike non-ASCII character in 'content'. Doesn’t seem to be the case. Maybe this is a bug that is specific to BaseX 9?
Gerrit
On 01.08.2018 21:17, Hugh Guiney wrote:
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