如何在java

时间:2016-10-21 16:23:54

标签: java xml xslt executable-jar saxon

我可以在命令行中轻松运行以下命令来转换xml文件:

java -jar saxon9he.jar -o:outputfile.xml data.xml transform.xslt

我想在java文件中完成相同的结果,所以我可以在我正在编写的程序中使用它。 我已将saxon9he.jar放在构建路径中,但如何在命令行之外调用相同的命令?

4 个答案:

答案 0 :(得分:2)

您最好使用标准Java API进行XML和XSLT处理:java.xml.transform

您需要访问的第一个类是javax.xml.transform.TransformerFactory,您可以使用它创建一个Transformer对象,然后使用该对象来运行XSLT转换。或者,您可以使用TransformerFactory创建Templates对象(这将导致Saxon预处理/编译/等等您的XSLT样式表),然后重复使用Templates对象为您的XSLT转换创建Transformer对象。

为了确保javax.xml.transform.TransformerFactory类映射到Saxon实现,您可以使用命令行选项摆弄引导类路径,或者使用代码执行相同的操作:

System.setProperty(" javax.xml.transform.TransformerFactory"," net.sf.saxon.TransformerFactoryImpl");

完成此操作后,对TransformerFactory.newInstance()的任何调用都将神奇地创建Saxon TransformerFactory实现。您可以更好地使用此方法,因为您将获得标准Java API的好处,并且您可以自由地转移到其他XSLT处理器。您可能希望使用XSLTC,它是Apache Xalan的一部分,因为它对某些类型的XSLT样式表更快。

答案 1 :(得分:2)

文档在这里:http://www.saxonica.com/documentation/index.html#!using-xsl/embedding

Saxon提供了两个用于从Java应用程序运行XSLT转换的API:JAXP API和s9api API。 JAXP是几乎所有Java XSLT处理器提供的标准接口,因此如果您希望应用程序可移植,则需要使用此接口;它的缺点是(a)它非常面向XSLT 1.0,这使得很难利用XSLT 2.0和XSLT 3.0中的新功能,以及(b)它不能很好地与API相关的任务集成,例如模式处理和XPath评估。

s9api API与Saxon在各种任务(包括XSLT,XQuery,XPath和XSD验证)中的功能更为匹配,但不可移植。

这是你的选择。

答案 2 :(得分:0)

public class UserDocument
    {
        [JsonProperty(PropertyName = "type")]
        public string type { get; set; }

        [JsonProperty(PropertyName = "taxYear")]
        public string taxYear { get; set; }

        [JsonProperty(PropertyName = "createdDate")]
        public double createdDate { get; set; }

        [JsonProperty(PropertyName = "processedDate")]
        public double processedDate { get; set; }

    }

参考javadoc here

答案 3 :(得分:0)

使用@Martin Honnen所说的话:

import net.sf.saxon.Transform;

class XSLTransform{
    public static void main(String args[]) throws Exception {

        String[] arglist = {"-o:outputfile.xml","data.xml", "transform.xslt"};

        Transform.main(arglist);

    }
}

似乎工作得很好。谢谢你的帮助