2012-07-12 75 views
0

在我進入具體細節之前,我先用Oracle的parser.v2 XSLT庫嘗試了這一點,並遇到同樣的問題(請參閱my first question)。但是,當我使用C#時,它工作正常。SAXTransform鏈中的第二個XSLT似乎沒有做任何事情

// from the example I see everywhere on the internet 
SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); 

Templates t_cctagstrip = stf.newTemplates(new StreamSource(new FileInputStream("C:\\path\\to\\first.xsl"))); 
Templates t_cctable = stf.newTemplates(new StreamSource(new FileInputStream("C:\\path\\to\\second.xsl"))); 

TransformerHandler th1 = stf.newTransformerHandler(t_cctagstrip); 
TransformerHandler th2 = stf.newTransformerHandler(t_cctable); 

// transform 1 pipes into transform 2 
th1.setResult(new SAXResult(th2)); 

// transform 2 pipes to System.out 
th2.setResult(new StreamResult(System.out)); 

Transformer t = stf.newTransformer(); 
t.transform(new StreamSource(new FileInputStream("C:\\path\\to\\source.xml")), new SAXResult(th1)); 

我在想,也許問題就在於從第一變換的輸出是在根級文本片段?

text at root level 
<tag> ... tags that need extra processing ... </tag> 
more text at root level 

C#如何處理轉換有什麼不同嗎?這不是失敗或給我任何警告,我可以告訴。這只是沒有改變任何東西。

回答

1

您在第一個問題中沒有提及您遇到的實際問題,例如提供任何日誌消息等,因此無法知道您的XSLT轉換失敗的原因。但在第二個問題中,你清楚地揭示了爲什麼事情失敗了。

通常,XSLT轉換要求所有解析的內容至少爲至少格式良好的XML。如果您的源文檔未包含「根」元素(實際上稱爲文檔元素),那麼它不是格式良好的XML,因此不是定義XML,因此不適用於XML處理。

作爲一種解決方案,如果您可以將第一個轉換的輸出包裝到文檔元素中,您可以繼續將其解析爲XML。之後您可以通過非XML流程剝離它。

Java或C#在這方面不會有任何區別。如果第一次轉換的輸出不是格式良好的XML,那麼C#不應該將其作爲XML接受。我無法解釋爲什麼它可能會這樣做—如果C#的XML處理器接受非格式良好的XML,它將不符合規範。我想,你沒有得到任何輸出的原因是,由於非XML源代碼,轉換隻是失敗。爲了找出實際發生的事情,您可以在Transformer上設置javax.xml.transform.ErrorListener,並在ErrorListener中將所有內容轉儲到日誌中。我認爲在Oracle的實現中必須有一些在Xalan或Saxon中不可用的特性,我們假設你需要使用Oracle的XSL處理器。真的嗎? ,因爲你將代碼綁定到一個實現上,而不是使用JAXP API,這當然不是推薦的做法。當編碼到API以確保它們不依賴於實現時調試問題可能更好,因爲你不能改變實現的內部代碼,最好只是調試你自己的缺陷,而不是甲骨文的。但是鑑於你上面的示例代碼似乎使用JAXP API,我假設你遇到的問題不是'實際上與Oracle的XSLProcessor綁定)。

+0

我找不到日誌消息。它似乎沒有失敗 - 只是沒有改變XML。但是,你的失敗原因是正確的,所以我將其標記爲答案。 – climbage 2012-09-04 22:18:35

相關問題