如何安装或注册 Saxon HE 10.3 配置?未使用配置

问题描述

我正在尝试为 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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...