Oxygen XML编辑器和Saxon扩展功能

问题描述

我正在发布请求帮助我让Saxon Extension功能在Oxygen XML Editor中工作的功能。我已经为函数定义,函数调用和初始化程序类创建了java类。我在一个JAR文件中有定义和函数调用,在另一个JAR文件中有初始化程序。我将JAR文件一个包含所有必需库的“ lib”文件夹放置在XSL所存储的目录中:

Project folder

我已在“转换方案”窗口的“扩展”对话框中列出了它们:

Extension libraries

并且我试图列出初始化程序:

Initializer

在以下对话框中选择“选择”按钮,然后选择“检测”按钮时,它不会检测到该类:

Not detecting

当我尝试进行转换时,我收到以下问题消息:

Errors

这是ExtensionDeFinition类的代码

import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDeFinition;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.value.SequenceType;

/**
 *
 * @author tfurst
 */
public class CreateXmlMapDeFinition extends ExtensionFunctionDeFinition{

    @Override
    public StructuredQName getFunctionQName() {
        return new StructuredQName("rcmt","http://rcmt.com/saxon-extension","create-map");
    }

    @Override
    public SequenceType[] getArgumentTypes() {
        return new SequenceType[]{SequenceType.SINGLE_STRING};
    }

    @Override
    public SequenceType getResultType(SequenceType[] sts) {
        return SequenceType.ANY_SEQUENCE;
    }

    @Override
    public ExtensionFunctionCall makeCallExpression() {
        return new CreateXmlExtension();
    }
    
}

这是函数调用代码

import com.rcmt.mapProcessor.ExcelMapProcessor;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.om.DocumentInfo;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.trans.XPathException;
import org.w3c.dom.Document;


public class CreateXmlExtension extends ExtensionFunctionCall{

    @Override
    public Sequence call(XPathContext xpc,Sequence[] args) throws XPathException 
    {
        String excelPath = args[0].head().getStringValue();
        DocumentInfo doc = getXml(xpc,excelPath);
        return doc;
    }
    

    private DocumentInfo getXml(XPathContext context,String path)
    {
        DocumentInfo xml = null;
        try 
        {
            Document d = ExcelMapProcessor.makeXml(path);
            xml = (DocumentInfo)context.getConfiguration().buildDocumentTree(makeSource(d));
            
        } 
        catch (XPathException ex) 
        {
            Logger.getLogger(CreateXmlExtension.class.getName()).log(Level.SEVERE,null,ex);
        }
        return xml;
    }
    
    private Source makeSource(Document doc)
    {
        Source result = null;
        try
        {
            TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl();

            Transformer trans = transformerFactory.newTransformer();
            DOMSource src = new DOMSource(doc);

            StreamResult res = new StreamResult(new ByteArrayOutputStream ());
            trans.transform(src,res);
            ByteArrayOutputStream so = (ByteArrayOutputStream)res.getoutputStream();
            result = new StreamSource(new ByteArrayInputStream(so.toByteArray()));
            
            so.close();
        }
        catch (TransformerException | IOException ex)
        {
            Logger.getLogger(CreateXmlExtension.class.getName()).log(Level.SEVERE,ex);
        }
        return result;
    }
}

这是我初始化程序的代码

import javax.xml.transform.TransformerException;
import net.sf.saxon.Configuration;
import net.sf.saxon.lib.Initializer;
import net.sf.saxon.om.NamePool;
import org.expath.httpclient.saxon.SendRequestFunction;
import com.rcmt.map.CreateXmlMapDeFinition;


/**
 *
 * @author tfurst
 */
public class SaxonExtinitializer implements Initializer{

    @Override
    public void initialize(Configuration config) throws TransformerException {
        config.registerExtensionFunction(new CreateXmlMapDeFinition());
        SendRequestFunction expathHttpClient = new SendRequestFunction();
        config.setNamePool(new NamePool());
        expathHttpClient.setConfiguration(config);
        config.registerExtensionFunction(expathHttpClient);
    }
    
}

最后,XSL中的用法

XSL Function Call

解决方法

如果您有一个jar包含扩展功能的ExtensionFunctionDefinitionExtensionFunctionCall,则在该jar中,在META-INF中文件夹,创建一个名为services的子文件夹,并在该文件夹的内部创建一个名为net.sf.saxon.lib.ExtensionFunctionDefinition的文本文件,该文件在每一行上列出了相关的类,例如CreateXmlMapDefinition(以其中的任何名称空间作为前缀)。

它看起来像这样:

enter image description here

然后在转换场景对话框中提供该jar作为扩展。您不需要那种初始化器。我已经测试过oXygen 22.1和Saxon 9.9。

相关问答

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