如何在java中使用参数运行saxon xslt转换

时间:2018-03-14 22:46:19

标签: java xslt xslt-1.0 saxon

我需要在java文件中运行此命令行arugment

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代码不行。

  

错误:'非静态Java函数的第一个参数' insertCallouts'不是有效的对象引用。'

     

致命错误:'非静态Java函数的第一个参数' insertCallouts'不是有效的对象引用。'

     

javax.xml.transform.TransformerConfigurationException:非静态Java函数的第一个参数' insertCallouts'不是有效的对象引用。

1 个答案:

答案 0 :(得分:0)

你看到的错误来自Xalan,而不是Saxon。

使用JAXP方法<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <li class="dropdown"> <a href="#" class="dropdown-toggle">Parent Link</a> <ul class="dropdown-menu"> <li> <div class="my-content"> <div class="row"> <ul> <li><a href="/">dropdown link</a></li> <li><a href="/">dropdown link</a></li> <li><a href="/">dropdown link</a></li> </ul> </div> </div> </li> </ul> </li>非常危险,因为您获得的XSLT处理器完全取决于类路径上的内容。加载您想要的处理器更加安全:例如,如果您想要Saxon Professional Edition,请使用TransformerFactory.newInstance()

更好的是,使用Saxon的s9api接口,而不是使用JAXP,它可以让您更好地控制参数传递给转换的方式。

另请注意,该错误与从样式表到外部Java方法的调用有关。它与您的问题的主题无关,即将参数从Java应用程序传递到XSLT代码。