如何安装或注册 Saxon HE 10.3 配置?配置未被使用
How to install or register a Saxon HE 10.3 Configuration? Configuration is not being used
我正在尝试为 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 转换 APIs。 net.sf.saxon.Transform.main
界面是为命令行使用而设计的,因此它只能通过命令行开关修改配置。它也有一些缺点,比如如果转换失败就会关闭 Java 虚拟机。
有一个解决方法,即在命令行上使用 -init 选项来触发用户提供的初始化代码(它可以访问 Configuration 对象),但这只会让你自己越陷越深。我建议切换到 s9api API.
文档:https://saxonica.com/documentation/index.html#!using-xsl/embedding
如果你想在从命令行 运行ning Saxon 时更改配置,正如 Michael 所说,有 -init
选项来传入 class 的名称实现 Initializer
接口 https://saxonica.com/documentation/index.html#!javadoc/net.sf.saxon.lib/Initializer 所以你可以粗略地使用例如
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;
}
}
});
}
}
编译它,把它放在 class 路径上,然后 运行 例如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
.
或者你可以子class net.sf.saxon.Transform
.
另一方面,如果您不想从命令行 运行 Saxon,而是从 JAXP API,那么我认为一种方法是创建 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);
我正在尝试为 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 转换 APIs。 net.sf.saxon.Transform.main
界面是为命令行使用而设计的,因此它只能通过命令行开关修改配置。它也有一些缺点,比如如果转换失败就会关闭 Java 虚拟机。
有一个解决方法,即在命令行上使用 -init 选项来触发用户提供的初始化代码(它可以访问 Configuration 对象),但这只会让你自己越陷越深。我建议切换到 s9api API.
文档:https://saxonica.com/documentation/index.html#!using-xsl/embedding
如果你想在从命令行 运行ning Saxon 时更改配置,正如 Michael 所说,有 -init
选项来传入 class 的名称实现 Initializer
接口 https://saxonica.com/documentation/index.html#!javadoc/net.sf.saxon.lib/Initializer 所以你可以粗略地使用例如
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;
}
}
});
}
}
编译它,把它放在 class 路径上,然后 运行 例如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
.
或者你可以子class net.sf.saxon.Transform
.
另一方面,如果您不想从命令行 运行 Saxon,而是从 JAXP API,那么我认为一种方法是创建 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);