我想添加一个功能来捕获现有应用程序的xsl:message输出。发现直接引用将messageListener添加到转换器但我的应用程序包含一个saxTransformerFactory.newTemplates()生成一个模板对象,然后用于创建xmlfilter,“XMLFilter xmlFilter = saxTransformerFactory.newXMLFilter(templates);”。如何在我的类中“实现MessageListener”?
答案 0 :(得分:1)
TransformerFactory和相关类是一个与产品无关的API(称为JAXP,有时也称为Trax),用于调用XSLT处理器。 MessageListener特定于Saxon产品。您可以使用Saxon的Controller对象注册MessageListener,该对象是JAXP Transformer的Saxon实现。如果你有一个JAXP Transformer,你需要将Transformer转换为Saxon Controller,然后调用setMessageListener。当您使用带有Saxon的XMLFilter时,XMLFilter将是net.sf.saxon.Filter的一个实例。这有一个getTransformer()方法,它返回Controller。
答案 1 :(得分:1)
正如Michael Kay解释的那样,但在Java Code中更多; - )
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(xslt);
if (transformer instanceof TransformerImpl) {
//saxon specific
TransformerImpl timpl = (TransformerImpl) transformer;
XsltTransformer saxonTransformer = timpl.getUnderlyingXsltTransformer();
saxonTransformer.setMessageListener( ...your listener... );
}