我花了很多时间试图找到支持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,但我不喜欢这个想法。
答案 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中运行,所以它使用了反射;但它应该有用。