Мне нужно запустить эту командную строку в файле java
java -jar output.docbook -o:output.fo -xsl:third_party\docbook_xsl\1_78_1\fo\docbook_FCRR.xsl axf.extensions=1 use.extensions=1
но то, что я пытаюсь, не работает. Вот что у меня есть
TransformerFactory tfactory = TransformerFactory.newInstance();
try {
// Create a transformer for the stylesheet.
Transformer transformer =
tfactory.newTransformer(new StreamSource(xslPath));
transformer.setParameter("axf.extensions","1");
transformer.setParameter("use.extensions","1");
// Transform the source XML to System.out.
transformer.transform(new StreamSource("output.docbook"),
new StreamResult(new File("output.fo")));
}catch(TransformerException e){
e.printStackTrace();
}
Код командной строки работает нормально, а код Java - нет.
ERROR: 'The first argument to the non-static Java function 'insertCallouts' is not a valid object reference.'
FATAL ERROR: 'The first argument to the non-static Java function 'insertCallouts' is not a valid object reference.'
javax.xml.transform.TransformerConfigurationException: The first argument to the non-static Java function 'insertCallouts' is not a valid object reference.




Ошибка, которую вы видите, исходит от Ксалана, а не от Саксонии.
Использование JAXP-метода TransformerFactory.newInstance() довольно опасно, потому что XSLT-процессор, который вы получаете, зависит исключительно от того, что лежит в пути к классам. Намного безопаснее загружать нужный процессор явно: например, если вы хотите Saxon Professional Edition, используйте new com.saxonica.ProfessionalTransformerFactory().
Еще лучше, чем использовать JAXP, использовать интерфейс Saxon s9api, который дает вам гораздо больше контроля над тем, как параметры передаются в преобразование.
Также обратите внимание, что ошибка связана с вызовом из таблицы стилей внешних методов Java. Это не имеет ничего общего с темой вашего вопроса, который передает параметры из приложения Java в код XSLT.