Ich brauche eine XSL-Transformation mit Apache FOP zu tun, und ich hatte Code wie folgt:um relative Pfade als XSLT-Dateien laden
//Setup FOP
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
//Setup Transformer
Source xsltSrc = new StreamSource(new File(xslPath));
Transformer transformer = tFactory.newTransformer(xsltSrc);
//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
//Setup input
Source src = new StreamSource(new File(xmlPath));
//Start the transformation and rendering process
transformer.transform(src, res);
wo xslPath
der Pfad ist, wo meine XSLT-Datei gespeichert wird.
Ich habe bestätigt, dass es funktioniert, wenn ich nur eine XSLT-Datei habe, aber in meinem Projekt habe ich Dinge in mehrere XSLT-Dateien unterteilt und sie mit dem <xsl:import />
-Tag verbunden. Mit dieser Konfiguration erhalte ich eine NullPointerException, weil sie nicht alle in XSLT gespeicherten Informationen versteht, da sie über verschiedene Dateien verteilt sind.
Ich frage mich, ob es eine Möglichkeit gibt, alle diese Dateien in der Source xsltSrc
Variable zu laden, so dass alle XSL-Informationen verfügbar sind.
UPDATE
Ich habe das auf der von Mads Hansen gegebenen Antwort basierten Code geändert, aber es funktioniert immer noch nicht. Ich muss die XSLT-SLT-Dateien in den Klassenpfad einbeziehen, also lade ich die XSLT-Datei mit ClassLoader. Ich habe überprüft, dass die URL den richtigen Pfad bei der Ausführung url.toExternalForm()
hat. Das ist mein neues Stück Code:
ClassLoader cl = this.getClass().getClassLoader();
String systemID = "resources/xslt/myfile.xslt";
InputStream in = cl.getResourceAsStream(systemID);
URL url = cl.getResource(systemID);
Source source = new StreamSource(in);
source.setSystemId(url.toExternalForm());
transformer = tFactory.newTransformer(source);
Es findet und lädt myfile.xslt
es gibt aber noch nicht die relativen Pfade zu den anderen XSLT-Dateien zu beheben.
Was mache ich falsch?
danke für deine Antwort, aber es scheint mein Problem nicht zu lösen, obwohl deine Antwort sinnvoll ist. Ich habe meine Frage mit meinen Änderungen im Code aktualisiert. – Javi
Möglicherweise müssen Sie einen absoluten Pfad für Ihre SystemID ermitteln. Es sei denn, Sie wissen, wo es den relativen Pfad "von" auflösen wird. Versuchen Sie, diesen relativen Pfad in einen absoluten Pfad umzuwandeln, etwa wie folgt: 'String xsltSystemId = neue Datei (systemID) .toURL() .toExternalForm();' oder 'String xsltSystemId = neue Datei (relativePath) .getAbsolutePath();' –
thanks Ich hatte das schon und ich hatte das überprüft. Wenn ich url.toExternalForm() mache, bekommt es einen absoluten Pfad. Aber ich weiß nicht, wo das Problem jetzt ist. – Javi