使用Saxon9he进行XSLT转换时抛出java.net.URISyntaxException:索引处路径中的非法字符

使用Saxon9he进行XSLT转换时抛出java.net.URISyntaxException:索引处路径中的非法字符,java,xml,xslt,saxon,Java,Xml,Xslt,Saxon,我正在尝试使用saxon进行xsl转换,但文件名有问题: package com.fop; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; public class XMLtoF

我正在尝试使用saxon进行xsl转换,但文件名有问题:

package com.fop;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class XMLtoFO {

    private static StreamResult out;
    private static StreamSource xml;
    private static StreamSource xsl;
    private static Transformer transformer;

    // TODO

    protected static void xmlToFO(String inputXSL, String[] inputxml,
            String[] fofilname) throws Exception {
        if (true) {
            System.setProperty("javax.xml.transform.TransformerFactory",
                    "net.sf.saxon.TransformerFactoryImpl");
        }
        for (int i = 0; i < inputxml.length; i++) {
            try {
                      out = new StreamResult( fofilname[i]  );
                      xml = new StreamSource( inputxml[i] );
                      xsl = new StreamSource( inputXSL );
                      transformer = TransformerFactory.newInstance().newTransformer( xsl );
                      transformer.transform( xml, out );
                System.err.println("\n--------------------------------------------------------------------------------------------\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Error on line 12 of root-template.xsl:
  java.net.URISyntaxException: Illegal character in path at index 19: 3-Leiter-Steuerung,Methode 2_result.fo.xml
; SystemID: file:/C:/Users/z003a5bp/Desktop/root-template.xsl; Line#: 12; Column#: -1
net.sf.saxon.trans.XPathException: java.net.URISyntaxException: Illegal character in path at index 19: 3-Leiter-Steuerung, Methode 2_result.fo.xml
    at net.sf.saxon.serialize.Emitter.makeOutputStream(Emitter.java:200)
    at net.sf.saxon.serialize.Emitter.makeWriter(Emitter.java:160)
    at net.sf.saxon.serialize.XMLEmitter.openDocument(XMLEmitter.java:145)
    at net.sf.saxon.serialize.XMLEmitter.startElement(XMLEmitter.java:309)
    at net.sf.saxon.event.NamespaceReducer.startElement(NamespaceReducer.java:73)
    at net.sf.saxon.event.ComplexContentOutputter.startContent(ComplexContentOutputter.java:558)
    at net.sf.saxon.event.ComplexContentOutputter.startElement(ComplexContentOutputter.java:183)
    at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:424)
    at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:373)
    at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:660)
    at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:138)
    at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:431)
    at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:373)
    at net.sf.saxon.expr.instruct.Template.applyLeavingTail(Template.java:239)
    at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:1057)
    at net.sf.saxon.Controller.transformDocument(Controller.java:2080)
    at net.sf.saxon.Controller.transform(Controller.java:1903)
    at com.fop.XMLtoFO.xmlToFO(XMLtoFO.java:29)
    at com.fop.Layout.output(Layout.java:151)
    at com.fop.Layout.actionPerformed(Layout.java:168)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.net.URISyntaxException: Illegal character in path at index 19: 3-Leiter-Steuerung, Methode 2_result.fo.xml
    at java.net.URI$Parser.fail(Unknown Source)
    at java.net.URI$Parser.checkChars(Unknown Source)
    at java.net.URI$Parser.parseHierarchical(Unknown Source)
    at java.net.URI$Parser.parse(Unknown Source)
    at java.net.URI.<init>(Unknown Source)
    at net.sf.saxon.serialize.Emitter.makeOutputStream(Emitter.java:172)
    ... 55 more
以下是我更改文件名的方式:

protected String[] fileName(String exten) {
    file = chooser.getSelectedFiles();
    pdffilename = new String[file .length];
    for (int i = 0; i < file .length; i++) {
        pdffilename[i] = file [i].getName();
        b = new StringBuilder(pdffilename[i]);
        b.replace(pdffilename[i].lastIndexOf("."),
                pdffilename[i].lastIndexOf("l") + 1, "_result"+exten+"");
        pdffilename[i] = b.toString();
    }
    return pdffilename;
}

文件名不是URI;您正在使用一个需要URI的文件名

最简单的答案是使用StreamSource的构造函数,该构造函数需要一个文件而不是URI。所以改变

new StreamSource(X)

因为“newfile()”构造函数使用文件名。(在内部,文件名将自动转换为URI,但您不必担心这一点)

protected String[] fileName(String exten) {
    file = chooser.getSelectedFiles();
    pdffilename = new String[file .length];
    for (int i = 0; i < file .length; i++) {
        pdffilename[i] = file [i].getName();
        b = new StringBuilder(pdffilename[i]);
        b.replace(pdffilename[i].lastIndexOf("."),
                pdffilename[i].lastIndexOf("l") + 1, "_result"+exten+"");
        pdffilename[i] = b.toString();
    }
    return pdffilename;
}
XMLtoFO.xmlToFO(inputxsl, inputxml, this.fileName("fo.xml"));
new StreamSource(X)
new StreamSource(new File(X))