2012-05-18 34 views
2

從這個問題晴續:XSLT: CSV (or Flat File, or Plain Text) to XML撒克遜在Java中:XSLT的CSV到XML

所以,我有一個XSLT從這裏:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html

,並將其轉換爲CSV文件到XML文檔。

Java的罐子saxon9he.jar -xsl:CSV到xml.csv - 它:主-o:的Output.xml

在命令行上的以下命令一起使用時它這樣做是

所以現在問題變成:我該如何在Java代碼中執行此操作?

現在我有代碼看起來像這樣:(該Transformernet.sf.saxon.Controller一個實例)

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
StreamSource xsltSource = new StreamSource(new File("location/of/csv-to-xml.xsl")); 
Transformer transformer = transformerFactory.newTransformer(xsltSource); 
StringWriter stringWriter = new StringWriter(); 
transformer.transform(documentSource, new StreamResult(stringWriter)); 
String transformedDocument = stringWriter.toString().trim(); 

在命令行上的訣竅是指定「 - 它:主「指向XSLT中的指定模板。這意味着您不必爲源文件提供「-s」標誌。

該問題從Java端再次啓動。在哪裏/如何指定這個「-it:main」?這樣做會不會破壞其他不需要指定的XSLT?我是否必須在每個XSLT文件「main?」中命名每個模板?鑑於Transformer.transform()的方法簽名,I 來指定源文件,所以這並不能擊敗我在計算這個東西時所取得的所有進展嗎?

編輯:我發現隱藏在saxon9he.jar中的s9api,如果有人正在尋找它。

回答

5

您正在使用爲XSLT 1.0設計的JAXP API。如果您想要使用XSLT 2.0功能,比如能夠在命名模板上啓動轉換,我建議使用s9api界面,而不是爲此設計更好的界面。但是,如果您有很多現有的JAXP代碼,並且您不想重寫它,那麼通常可以通過將JAXP對象向下轉換爲底層的Saxon實現類來實現您想要的效果。例如,您可以將JAXP Transformer轉換爲net.sf.saxon.Controller,並使您可以訪問controller.setInitialTemplate();當調用transform()方法時,只需提供null作爲Source參數。順便說一句,如果你正在編寫需要2.0處理器的代碼,那麼我不會使用TransformerFactory.newInstance(),它會給你任何在類路徑中找到的舊XSLT處理器。使用新的net.sf.saxon.TransformerFactoryImpl()來代替,它(a)更健壯,(b)更快。