Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Saxon:用于CSV到XML的XSLT_Java_Xml_Xslt_Csv_Saxon - Fatal编程技术网

Java中的Saxon:用于CSV到XML的XSLT

Java中的Saxon:用于CSV到XML的XSLT,java,xml,xslt,csv,saxon,Java,Xml,Xslt,Csv,Saxon,主要从这个问题继续: 因此,我这里有一个XSLT: 它将CSV文件转换为XML文档。当与命令行上的以下命令一起使用时,它会执行此操作: java-jarsaxon9he.jar-xsl:csv-to-xml.csv-it:main-o:output.xml 现在的问题变成了:如何在Java代码中做到这一点? 现在我有这样的代码: TransformerFactory transformerFactory = TransformerFactory.newInstance(); StreamSour

主要从这个问题继续:

因此,我这里有一个XSLT:

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

java-jarsaxon9he.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中,如果有人在寻找它的话。

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

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

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