Hi Max, This sounds like a good thing. Another solution to the result-document issue might be to implement the XQuery 3.1 transform function [1]
/Andy [1] http://www.w3.org/TR/xpath-functions-31/#func-transform On 3 August 2015 at 20:54, Max Goltzsche <max.goltzs...@algorythm.de> wrote: > Hello Vincent, > > besides an URI resolver I also want to set XSLT 2.0's output destination > in BaseX. > Currently as you can see in BaseX' xslt:transform and xslt:transform-text > implementation in > https://github.com/BaseXdb/basex/blob/master/basex-core/src/main/java/org/basex/query/func/xslt/XsltTransform.java > there is neither an URIResolver or OutputURIResolver set on the Transformer > nor a destination systemId set on its StreamResult. Thus Saxon resolves > output paths relative to your Java process' working directory (in fact all > relative XSL include, import, document and collection paths in the XSLT > passed to the transform method). > Unfortunately to change this behaviour the XsltTransform class must be > enhanced. > If you need a quicker* solution for your problem you may have to build > your own BaseX transform Java Module based on the XsltTransform class > setting at least the StreamResult's systemId I think. > I will be also working on this the next evenings. > > best regards, > Max > > > On 03.08.2015 20:54, Lizzi, Vincent wrote: > > 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" > <http://www.w3.org/1999/XSL/Transform> xmlns:xs= > "http://www.w3.org/2001/XMLSchema" <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 > > >