我有一个简单的程序,必须对给定的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的步骤 尝试查找工厂时执行:
- 使用该值 如果它是javax.xml.transform.TransformerFactory系统属性 存在。
- 如果存在JRE / lib / jaxp.properties,则查找a javax.xml.transform.TransformerFactory =中的ImplementationClass条目 那个文件。
- 使用JAR文件服务提供程序查找 名为META-INF / services / javax.xml.transform.TransformerFactory的文件 在CLASSPATH上的任何JAR文件中。
- 使用默认值 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的传递依赖,例如我不使用属性方式会发生什么?