Мне нужно преобразовать 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 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
Я изменил код, основанный на ответе, данном Mads Hansen, но он все еще не работает. Я должен включить файлы slt XSLT в путь к классам, поэтому я загружаю 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.
Что я делаю неправильно?