问题描述
我正在尝试为 saxon HE 10.3 使用自定义配置。
未使用配置。大概需要注册或安装配置?但是怎么办?
这是我的代码:
final Configuration config = new net.sf.saxon.Configuration();
/**/ config.setLocalizerFactory(new LocalizerFactory() {
public Numberer getNumberer(final String language,final String country) {
if (language.equals("de")) {
return Numberer_de.getInstance();
} else {
return null;
}
}
});
net.sf.saxon.Transform.main(new String[] {
"-s:source.xml","-xsl:stylesheet.xslt","-o:result.txt"
});
解决方法
您真的不想从 Java 应用程序运行 net.sf.saxon.Transform.main
:使用 s9api 或 JAXP 转换 API。 net.sf.saxon.Transform.main
接口是为从命令行使用而设计的,因此它只能通过命令行开关修改配置。它也有一些缺点,比如如果转换失败就会关闭 Java VM。
有一种变通方法,即在命令行上使用 -init 选项来触发用户提供的初始化代码(它可以访问 Configuration 对象),但这只是让自己更深入地挖掘自己的漏洞。我建议切换到 s9api API。
文档:https://saxonica.com/documentation/index.html#!using-xsl/embedding
,如果您想在从命令行运行 Saxon 时更改配置,正如 Michael 所说,有 -init
选项可以传入实现 Initializer
接口的类的名称 {{3 }} 所以你会大致使用例如
package com.example;
import net.sf.saxon.option.local.Numberer_de;
import net.sf.saxon.lib.Initializer;
import net.sf.saxon.Configuration;
import net.sf.saxon.lib.LocalizerFactory;
import net.sf.saxon.lib.Numberer;
import javax.xml.transform.TransformerException;
public class MyInitializer implements Initializer {
public override void initialize(Configuration config) throws TransformerException {
config.setLocalizerFactory(new LocalizerFactory() {
public Numberer getNumberer(final String language,final String country) {
if (language.equals("de")) {
return Numberer_de.getInstance();
} else {
return null;
}
}
});
}
}
编译它,把它放在类路径上,然后运行例如java -cp saxon-he-10.3.jar;com/example/MyInitializer;net/sf/saxon/option/local/Numberer_de net.sf.saxon.Transform -init:com.example.MyInitializer -s:source.xml -xsl:stylesheet.xslt -o:result.txt
。
或者您可以子类化 net.sf.saxon.Transform
。
另一方面,如果您不想从命令行而是从 JAXP API 运行 Saxon,那么我认为一种方法是创建 Configuration
例如
Configuration config = new Configuration();
config.setLocalizerFactory(new LocalizerFactory() {
public Numberer getNumberer(final String language,final String country) {
if (language.equals("de")) {
return Numberer_de.getInstance();
} else {
return null;
}
}
});
TransformerFactory transformerFactory = new TransformerFactoryImpl(config);
Templates templates = transformerFactory.newTemplates(xsltSource);
,
缺少的是如何注入配置。这对我有用:
import net.sf.saxon.Configuration;
import net.sf.saxon.TransformerFactoryImpl;
import net.sf.saxon.lib.Feature;
final TransformerFactoryImpl factory = (TransformerFactoryImpl) TransformerFactory.newInstance();
factory.getProcessor().setConfigurationProperty(Feature.CONFIGURATION,config);