2014-04-10 48 views
0

我花了很多时间试图找到TransformerFactory,这将支持StAXSource,因为我的输入是XMLStreamReaderStAXSource似乎是最合适的。最后,我遇到了以下和它的工作:哪个XSLT处理器支持XSLT 2.0和StAXSource?

TransformerFactory.newInstance(
    "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", 
null); 

现在我发现自己尝试使用以下this SO answer分组,并使用xsl:for-each-grouppastebin)取得了成功。后来我发现,上述TransformerFactory不支持XSLT 2.0,我不能工作了如何申请Muenchian分组的(我想this输入转化为输出的this

我希望能够支持XSLT 2.0,所以我放弃了与Muenchian分组挣扎的想法。我发现,SAXON支持XSLT 2.0

TransformerFactory factory = TransformerFactory.newInstance(
    "net.sf.saxon.TransformerFactoryImpl", 
null); 

唉,不支持StAXSource。是否有任何支持XSLT 2.0和StAXSource的XSLT处理器?

作为替代方法,是否有将XMLStreamReader转换为SAXON可以支持的方法(例如,对于StreamSource,A StringReader)?

最后的方法是找出这个Muenchian分组和完全折扣XSLT 2.0,但我不喜欢这个想法。

回答

1

事实证明,不宜过长后,我提出这个问题,我找到了解决办法:

SAXON是惊人的,而实际上不支持从XMLStreamReader读书,只是没有使用StAXSource。我发现一个little thread,解释了很多关于为什么StAXSource存在时,它没有得到广泛支持,并提供了一个可行的选择。

因此,而不是使用:

Source source = new StAXSource(xmlStreamReader); 

我使用了以下内容:

StaxBridge bridge = new StaxBridge(); 
bridge.setXMLStreamReader(reader); 
Source source = new PullSource(bridge); 

和我有一个XSLT处理器可以与XMLStreamReader工作,同时支持XSLT 1.0和2.0。

0

您还没有说通过什么版本的撒克逊。有9.5个单元测试用StaxSource演示了成功操作 - 我刚刚检查过。这在内部有点棘手,因为StaxSource在JDK 1.5中不可用,代码必须在1.5中运行,所以它使用反射;但它应该工作。

+0

好点。我一直在部署到WSO2 ESB 4.8.1,所以我不知道如何。我挖了一遍,发现了一个'Saxon9he.jar'。目前还不清楚什么是次要版本,但是当我尝试使用StAXSource时发现它会发生变化,我会冒险猜测它并不是9.5。你对JDK 1.5的评论很有趣。我正在使用JDK 1.7,并且还原不是一个选项。好消息是PullSource的工作原理也是基于您对Nabble的回应之一,因此这不是一个主要问题。谢谢! – Roberto

+0

您可以在命令行中使用-t找到正在使用的版本,或执行“java -cp saxon9he.jar net.sf.saxon.Version”。 –

+0

谢谢迈克尔。我正在使用“Saxonica的SAXON 9.4.0.4(build 062515)”。 – Roberto