如何安装或注册 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);