java - Oxygen XML 编辑器和 Saxon 扩展功能

标签 java xml xslt saxon oxygenxml

我发帖寻求帮助,让我的 Saxon 扩展功能在 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, null, 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

最佳答案

如果您有一个包含扩展函数的 ExtensionFunctionDefinitionExtensionFunctionCall 的 JAR 文件,那么,在该 JAR 文件中的 META- INF 文件夹,创建一个名为 services 的子文件夹,并在该文件夹内创建一个名为 net.sf.saxon.lib.ExtensionFunctionDefinition 的文本文件,该文件在每行列出相关类,例如 CreateXmlMapDefinition(以它所在的任何命名空间为前缀)。

看起来像这样:

Enter image description here

然后在转换场景对话框中提供该 JAR 文件作为扩展名。这样你就不需要任何初始化程序了。我测试过 Oxygen 22.1 和 Saxon 9.9。

关于java - Oxygen XML 编辑器和 Saxon 扩展功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64046027/

相关文章:

c# - 如何在 C# 2.0 中使用 XSLT 转换 XMLDocument

java - Hibernate Validator 验证集

java - 如何在应用程序中重新创建网站内容?

xml - XSL - 恒等变换 - 改变元素的值

c - freebsd 的 xml xsd 处理库

java - Android - 编辑操作栏按钮文本

xml - XSLT - 如何修剪 xsl :value-of expressions 中的所有值

java - 套接字创建超时

java - 使用 Hibernate 条件查询无顺序

java - 数组和 For 循环 (JAVA)