I'm trying to use the XSLT Module in BaseX 8.2.3 with Saxon 9.6 to run an XSLT 
that produces several output documents using xsl:result-document. I'm having 
trouble setting the location of the output documents. I want to have 
xsl:result-document create the output documents in a temporary folder because 
the documents need to be zipped together.

According to Saxon's documentation, the a relative path in the href attribute 
of xsl:result-document will be resolved using either the path of the 
Destination, or the current directory. The XSLT Module does not appear have a 
way to provide a path for a destination document.  What I'm seeing is that the 
result documents are created in BaseX's home directory. The XSLT works as 
expected when run using Saxon from the command line, where it's possible to set 
a destination path.

Is there a way to specify a Base Output URI to the XSLT Module? Or, would it be 
possible to specify a file URI output location to a method like xslt:transform?

One possible workaround is to provide an absolute path as a parameter to the 
XSLT, and use that parameter in the xsl:result-document href location.

Here is a self-contained example code:


declare function local:example($in, $xsl, $zipPath) {
  let $tempDir := file:create-temp-dir('test', 'example')
  let $x := xslt:transform-text($in, $xsl)
  return
    let $zip := archive:create-from($tempDir)
    return (
      file:write-binary($zipPath, $zip)
      (: , file:delete($tempDir, true()) :)
    )
};


let $xsl := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
xmlns:xs="http://www.w3.org/2001/XMLSchema"; version="2.0">
    <xsl:template match="/">
        <xsl:result-document href="doc1.xml">
            <test>this is a test 1 <xsl:apply-templates/></test>
        </xsl:result-document>
        <xsl:result-document href="doc2.xml">
            <test>this is a test 2 <xsl:apply-templates/></test>
        </xsl:result-document>
    </xsl:template>
</xsl:stylesheet>

let $doc := <test>this is input</test>

let $zipPath := 'report.zip'

return local:example($doc, $xsl, $zipPath)

The expected output is a zip file report.zip that contains doc1.xml and 
doc2.xml.

However, what I'm seeing is that report.zip is created as an empty zip file and 
doc1.xml and doc2.xml are placed in BaseX's home directory.

Thanks,
Vincent

Reply via email to