Мне нужно выполнить XSL-преобразование с использованием Apache FOP, и у меня был такой код:
//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);
, где xslPath
- это путь к моему XSLT-файлу.
Я подтвердил, что он работает, когда у меня есть только один XSLT-файл, но в моем проекте я разделил вещи на несколько XSLT-файлов и соединил их с помощью тега <xsl:import />
. С этой конфигурацией я получаю исключение NullPointerException, поскольку оно не понимает всю информацию, хранящуюся в XSLT, поскольку оно распространяется по разным файлам.
Интересно, есть ли способ загрузить все эти файлы в переменную Source xsltSrc
, чтобы была доступна вся информация XSL.
UPDATE
Я изменил код, основываясь на ответе Мадса Хансена, но он все еще не работает. Я должен включить XSLT slt файлы в classpath, поэтому я загружаю XSLT файл с ClassLoader. Я проверил, что URL имеет правильный путь при выполнении url.toExternalForm()
. Это мой новый кусок кода:
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);
Находит и загружает myfile.xslt
, но все равно не разрешает относительные пути к другим файлам XSLT.
Что я делаю не так?