ho bisogno di fare una trasformazione XSL usando Apache FOP e ho avuto il codice come questo:Risoluzione percorsi relativi durante il caricamento di file XSLT
//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);
dove xslPath
è il percorso in cui è memorizzato il mio file XSLT.
Ho confermato che funziona quando ho un solo file XSLT, ma nel mio progetto ho diviso le cose in diversi file XSLT e li ho uniti con il tag <xsl:import />
. Con questa configurazione, ottengo una NullPointerException perché non capisce tutte le informazioni memorizzate in XSLT perché è distribuita su file diversi.
Mi chiedo se è possibile caricare tutti questi file nella variabile Source xsltSrc
in modo che tutte le informazioni XSL siano disponibili.
UPDATE
ho cambiato il codice in base alla risposta data da Mads Hansen, ma ancora non funziona. Devo includere i file slt XSLT nel classpath, quindi carico il file XSLT con ClassLoader. Ho controllato che l'URL abbia il percorso corretto quando si esegue url.toExternalForm()
. Questo è il mio nuovo pezzo di codice:
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);
Essa trova e carichi myfile.xslt
ma ancora non risolve i percorsi relativi agli altri file XSLT.
Cosa sto sbagliando?
grazie per la risposta, ma non sembra risolvere il mio problema, anche se la risposta ha un senso. Ho aggiornato la mia domanda con le mie modifiche nel codice. – Javi
Potrebbe essere necessario ottenere un percorso assoluto per il SystemID. A meno che tu non sappia dove risolverà il percorso relativo "da". Prova a convertire quel percorso relativo in un percorso assoluto con qualcosa di simile: 'String xsltSystemId = new File (systemID) .toURL(). AExternalForm();' o 'String xsltSystemId = new File (relativePath) .getAbsolutePath();' –
grazie , Avevo già pensato e ho verificato che quando eseguo url.toExternalForm() ottiene un percorso assoluto. Ma non so dove sia il problema ora. – Javi