0
votes

I'm using Saxon parser to split the big file into smaller ones. Below is my sample code,

  TransformerFactory tFactory = TransformerFactory.newInstance();
           Transformer transformer = tFactory
                    .newTransformer(new StreamSource(new File(xsltPath)));
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            transformer.transform(new StreamSource(new File(sourcePath)),
                    new StreamResult(new File(resultDir)));

Where sourcePath = C:/path/Temp/AppModule.xml xsltPath = C:/path/Temp/create-fragment.xslt resultDir = C:/path/Temp/

This code splits the AppModule.xml into smaller xml files perfectly but with exception in the console,

Error java.io.FileNotFoundException: C:\path\Temp (Access is denied) net.sf.saxon.trans.XPathException: java.io.FileNotFoundException: C:\path\Temp (Access is denied)

I googled and found that I should specify the exact file name to new File() method. But as you see, the file name i do not know at compile time, only during run time the parser identifies the input AppModule.xml and split the xml into smaller files with the name of value tag in it.

AppModule.xml

    <?xml version='1.0' encoding='UTF-8'?>
<data>
<value>A1</value>
<value>B1</value>
<value>C1</value>
<value>A2</value>
<value>B2</value>
<value>C2</value>
</data>

OutPut: A1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<test>A1</test>

Similarly it will create B1,c1,A2,B2,C2 files correspondingly.

Please share your valuable comments.

1
You can scan the directory and find what files were created, then assign them to their File handles. See: "How to scan a folder in Java"Ceiling Gecko
Are you sure your problem is not: "Access is denied"? Make sure file permissions are correct or change the location to one that is accessible by the program.Risadinha

1 Answers

1
votes

The file you give in the result object should not be a directory. If the transformation produces no "primary" output file, but only produces output using xsl:result-document, then you should specify the result file as something like new File("c:/path/temp/dummy.xml"). This file will be used as the "base output URI" for resolving any relative filename supplied in xsl:result-document/@href.

The API you are using is called JAXP, and the problem is that it was designed for XSLT 1.0, where you could only have one result document. Saxon has attempted to stretch the concepts in JAXP to make it work with XSLT 2.0, but it's not really designed for the job. You might like to look at Saxon's s9api interface as an alternative.