我可以将messageListener添加到xslt Template对象吗?

时间:2013-04-26 15:14:56

标签: xslt sax

我想添加一个功能来捕获现有应用程序的xsl:message输出。发现直接引用将messageListener添加到转换器但我的应用程序包含一个saxTransformerFactory.newTemplates()生成一个模板对象,然后用于创建xmlfilter,“XMLFilter xmlFilter = saxTransformerFactory.newXMLFilter(templates);”。如何在我的类中“实现MessageListener”?

2 个答案:

答案 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... );
}