2013-03-13 80 views
2

我使用Saxon 9来执行Java中的XSL转换。如果在转换过程中出现错误,Saxon会将输出导向其所运行的JVM的标准错误流。我的Java应用程序有标准输出和错误的日志记录机制。我如何强制Saxon使用错误输出流而不是JVM默认错误输出流?如何在Java中更改Saxon的标准错误输出流?

回答

2

撒克逊将错误转移到javax.xml.transform.ErrorListener对象。最初,这些对象中有一个将异常写入stderr,但您可以轻松创建新的ErrorListener对象并实现它的warning,errorfatalError方法,以将它们发送到您的自定义日志记录机制。

如何设置新的ErrorListener取决于whether you are using the JAXP interface or the s9api interface。对于JAXP接口,您可以在Transformer对象上调用setErrorListener。对于s9api接口,您可以在创建处理器时或在XsltCompiler对象或XsltTransformer对象上提供的配置对象上使用setErrorListener方法。无论如何,其中有几个。

像这样的东西(s9api):

final PrintStream logFile = 
    new java.io.PrintStream("errorlog.txt"); // for example 

Configuration configuration = new Configuration(); 
configuration.setErrorListener(new ErrorListener() { 
    @Override 
    public void warning(TransformerException exception) throws TransformerException { 
     exception.printStackTrace(logFile); // or wherever 
    } 

    @Override 
    public void error(TransformerException exception) throws TransformerException { 
     exception.printStackTrace(logFile); 
    } 

    @Override 
    public void fatalError(TransformerException exception) throws TransformerException { 
     exception.printStackTrace(logFile); 
    } 
}); 
Processor proc = new Processor(configuration); 
... 

如果你不想使用标准错误程序中的事情,虽然,它可能会更好,只是把它重定向程序范围内使用System.setErr

System.setErr(new java.io.PrintStream("errorlog.txt")); 

它需要一个PrintStream对象,您可以环绕任何类型的输出/流,因此我确信它可以用于您的自定义日志记录机制。