哪个XSLT处理器同时支持XSLT 2.0和StAXSource?

时间:2014-04-10 13:41:46

标签: xml xslt saxon stax

我花了很多时间试图找到支持TransformerFactory的{​​{1}},因为我的输入是StAXSource,而XMLStreamReader似乎是最合适的。最终我遇到了以下内容并且有效:

StAXSource

现在我发现自己尝试在this SO answer之后使用分组,并且使用TransformerFactory.newInstance( "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", null); pastebin)取得了成功。然后我发现上面的xsl:for-each-group不支持XSLT 2.0,我无法弄清楚如何应用Muenchian分组(我希望this输入转换为this输出)

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

TransformerFactory

唉,它不支持TransformerFactory factory = TransformerFactory.newInstance( "net.sf.saxon.TransformerFactoryImpl", null); 。是否有任何支持XSLT 2.0和StAXSource的XSLT处理器?

作为替代方案,有没有办法将XMLStreamReader转换为SAXON可以支持的东西(例如StAXSource的{​​{1}}}?

最后一种方法是弄清楚这个Muenchian分组并完全打折XSLT 2.0,但我不喜欢这个想法。

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);

我有一个可以与XMLStreamReader一起使用的XSLT处理器,支持XSLT 1.0和2.0。

答案 1 :(得分:0)

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