Question on apply_templates_returning_file
Using the Python saxonc module of Saxon HEC 1.2.1 on Windows 10 I am struggling to use
apply_templates_returning_file of XSLT 3 processor, it seems that any input and source file names passed in a resolved relative to the current working directory while the
output_file is attempted to be written
file:/C:/output_file where with usual Windows settings the access is denied.
So to explain it with some code, running
import saxonc with saxonc.PySaxonProcessor() as proc: print(proc.version) xslt30_processor = proc.new_xslt30_processor() result = xslt30_processor.apply_templates_returning_string(source_file = "input-sample1.xml", stylesheet_file = "identity.xsl") print(result)
in a local user directory where the files
identity.xsl are present runs fine and seems to resolve those local file names given in the arguments automatically to the current working directory.
When I try to use an
output_file keyword argument, as in
import saxonc with saxonc.PySaxonProcessor() as proc: print(proc.version) xslt30_processor = proc.new_xslt30_processor() xslt30_processor.apply_templates_returning_file(source_file = "input-sample1.xml", stylesheet_file = "identity.xsl", output_file = "output_file_test1.xml")
I get an error
Error Failed to create output file file:/C:/output_file_test1.xml: access denied
Is that supposed to work that way? Why are input and XSLT file names resolved relatively to the current working directory but the output file is written to the root directory and not to the current working directory?
Please register to reply
Thanks for reporting this issue. This is not right that the output files gets written to the root directory it should be to the cwd. I will raise a bug against it.
What is happening is the resolving is done against what is set in the cwd, which you can set yourself. If the cwd is not set, then it writes the file to the root directory which is probably not the right thing to do.
As a workaround you can do the following:
xslt30_processor = proc.new_xslt30_processor() xslt30_processor.set_cwd("C:/pathlocation")
You can also set the cwd on the SaxonProcessor object which would filter to all created Processors created. i.e.
Just to add the cwd would work work for locating any relative filenames for stylesheets, source files given.
On second thoughts we think the following should apply:
- When executing processor on the commandline then the output files should be written to the cwd to where the command has been executed.
- When executing processor via an API then the user should be more explicit as to where the file should be written. Therefore setting the cwd is required.
At the moment given relative file names the user can set a different location to the writing of the file and where the stylesheet file lives. We will look into this issue.
I can live with setting the cwd, doing an
import os and then
seems to solve it, at least in standalone test cases.
Note, however, that
transform_to_file suffers from the same problem of trying to write to
file:///C:/ and there even the documentation at https://www.saxonica.com/saxon-c/doc/html/saxonc.html#PyXslt30Processor-transform_to_file has a simple example with only relative file names:
xsltproc.transform_to_file(source_file="cat.xml", stylesheet_file="test1.xsl", output_file="result.xml")
The transform_to_file requires the cwd to be set too.
Please register to reply