在Java中设置xslt处理器的最佳方法是什么?

时间:2016-02-11 08:58:20

标签: java xml xslt jar

我有一个简单的程序,必须对给定的xml(> 1GB)进行xslt转换。

public static void main(String[] args) throws Exception {
    if (args.length != 2) {
        System.err.println(
            "Usage: java Transform [xmlfile] [xsltfile]");
        System.exit(1);
    }

    File xmlFile = new File(args[0]);
    File xsltFile = new File(args[1]);

    // JAXP reads data using the Source interface
    Source xmlSource = new StreamSource(xmlFile);
    Source xsltSource = new StreamSource(xsltFile);

    // the factory pattern supports different XSLT processors
    TransformerFactory transFact =
            TransformerFactory.newInstance();
    Transformer trans = transFact.newTransformer(xsltSource);

    trans.transform(xmlSource, new StreamResult(System.out));
}

我想从我阅读的文档中使用Xalan 2.7.1:

  

最后,如果JAXP找不到任何实现类   这三个位置,它使用其默认实现   的TransformerFactory。总而言之,以下是JAXP的步骤   尝试查找工厂时执行:

  1. 使用该值   如果它是javax.xml.transform.TransformerFactory系统属性   存在。
  2. 如果存在JRE / lib / jaxp.properties,则查找a   javax.xml.transform.TransformerFactory =中的ImplementationClass条目   那个文件。
  3. 使用JAR文件服务提供程序查找   名为META-INF / services / javax.xml.transform.TransformerFactory的文件   在CLASSPATH上的任何JAR文件中。
  4. 使用默认值   TransformerFactory实例。 (JAXP1.1的实现   Translet的TransformerFactory。)от   com.sun.org.apache.xalan.internal.xsltc.trax

所以,如果我把Xalan-2.7.1.jar放在类路径(3)上会被击中,一切都会好的。 但我想知道哪个是定义TransformerFactoryImpl的最佳方式?

我认为作为一种变体来创建 jaxp.properties 文件并放入资源目录并在其中指定

  

factoryImpl = org.apache.xalan.processor.TransformerFactoryImpl

然后在代码中设置javax.xml.transform.TransformerFactory属性。 这样,当更改处理器的植入时,只会更改属性文件。

但这使逻辑变得复杂,我想知道如果我改变实现,JVM将在类路径上找到新的jar,并将使用其他实现。 那么有一个很好的理由选择属性决定或只是添加适当的jar将解决所有问题? 如果其他jar带有对Saxon的传递依赖,例如我不使用属性方式会发生什么?

0 个答案:

没有答案