Как запустить преобразование saxon xslt в java с параметрами

Мне нужно запустить эту командную строку в файле 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.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
752
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка, которую вы видите, исходит от Ксалана, а не от Саксонии.

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

Еще лучше, чем использовать JAXP, использовать интерфейс Saxon s9api, который дает вам гораздо больше контроля над тем, как параметры передаются в преобразование.

Также обратите внимание, что ошибка связана с вызовом из таблицы стилей внешних методов Java. Это не имеет ничего общего с темой вашего вопроса, который передает параметры из приложения Java в код XSLT.

Другие вопросы по теме