3

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

4

1 回答 1

5

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

如何设置新的 ErrorListener 取决于您使用的是 JAXP 接口还是 s9api 接口。对于 JAXP 接口,您可以调用setErrorListenerTransformer 对象。对于 s9api 接口,setErrorListener您可以在创建处理器时提供配置对象上的方法,或者在 XsltCompiler 对象上或 XsltTransformer 对象上提供方法。反正周围有好几个。

像这样的东西(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);
...

如果您不想对程序中的任何内容使用 stderr,最好使用System.setErr在程序范围内重定向它:

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

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

于 2013-03-13T23:24:00.573 回答