2014-04-10 47 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