views:

21

answers:

1

Im new to the XSLT world, I am basically trying to run the JSON convertion from HERE

However if I use this method:

TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer(new StreamSource("src\\json\\xml-to-json.xsl"));
        transformer.transform(new StreamSource("src\\json\\xmltest.xml"), new StreamResult(new FileOutputStream("birds.out")));

        System.out.println(result);

I get the following error:

SystemId Unknown; Line #59; Column #127; Could not find function: if
SystemId Unknown; Line #59; Column #127; Extra illegal tokens: 'then', 'http://json.org/', ':', 'create-node', '(', '$', 'input', ',', 'false', '(', ')', ')', 'else', 'http://json.org/', ':', 'create-simple-node', '(', '$', 'input', ')'
SystemId Unknown; Line #59; Column #127; function token not found.

If I use Saxon, I would rather use the inbuit one due to licensing, but just call the main it works:

String[] args = new String[2];
args[0]="d:\\xmltest.xml";
args[1]="d:\\xml-to-json.xsl";
net.sf.saxon.Transform.main(args);

But im not sure how to actually code that correctly (not calling main) in Java so I can store the results.

Cheers

+2  A: 

There are two questions here. 1) Why is the first attempt failing with errors? and 2) how to get results from Saxon?

1) The first attempt fails because you're using an XSLT 1.0 processor. As the page you referenced says,

XSLTJSON is an XSLT 2.0 stylesheet to transform arbitrary XML to JavaScript Object Notation (JSON). ... If you do not have an XSLT 2.0 processor, you can use XSLTJSON Lite, which is an XSLT 1.0 stylesheet to transforms XML to the JSONML format.

So if you use XSLTJSON Lite, your problems should be solved.

2) If you still want to try Saxon, this page looks useful. Rather than calling Saxon directly, it uses

 // set the TransformFactory to use the Saxon TransformerFactoryImpl method
 System.setProperty("javax.xml.transform.TransformerFactory",
                    "net.sf.saxon.TransformerFactoryImpl");

before the

 TransformerFactory tfactory = TransformerFactory.newInstance();
LarsH
Good and thorough answer, +1.
Dimitre Novatchev