2012-05-18 32 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)更快。