2

主要从这个问题继续:XSLT: CSV (or Flat File, or Plain Text) to XML

所以,我从这里有一个 XSLT:http: //andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html

并将 CSV 文件转换为 XML 文档。在命令行上与以下命令一起使用时会执行此操作:

java -jar saxon9he.jar -xsl:csv-to-xml.csv -it:main -o:output.xml

所以现在问题变成了:我如何在我的 Java 代码中做到这一点?

现在我有如下代码:

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();

Transformer是 的一个实例net.sf.saxon.Controller。)

命令行的诀窍是指定“-it:main”以指向 XSLT 中的命名模板。这意味着您不必为源文件提供“-s”标志。

问题再次出现在 Java 端。我将在哪里/如何指定这个“-it:main”?这样做不会破坏其他不需要指定的 XSLT 吗?我是否必须将每个 XSLT 文件中的每个模板命名为“main”?鉴于 Transformer.transform() 的方法签名,我必须指定源文件,所以这不会破坏我在解决这个问题方面取得的所有进展吗?

编辑:如果有人在寻找它,我发现 s9api 隐藏在 saxon9he.jar 中。

4

1 回答 1

5

您正在使用为 XSLT 1.0 设计的 JAXP API。如果您想利用 XSLT 2.0 的特性,例如在命名模板上启动转换的能力,我建议您改用 s9api 接口,它为此目的设计得更好。

但是,如果您有很多现有的 JAXP 代码并且您不想重写它,您通常可以通过将 JAXP 对象向下转换为底层 Saxon 实现类来实现您想要的。例如,您可以将 JAXP 转换器转换为 net.sf.saxon.Controller,这样您就可以访问 controller.setInitialTemplate();在调用 transform() 方法时,只需提供 null 作为 Source 参数。

顺便说一句,如果您正在编写需要 2.0 处理器的代码,那么我不会使用 TransformerFactory.newInstance(),它会为您提供它在类路径中找到的任何旧 XSLT 处理器。改用新的 net.sf.saxon.TransformerFactoryImpl(),(a) 更健壮,(b) 更快。

于 2012-05-18T20:48:22.977 回答