首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >萨克森-他的综合扩展函数?如何和地点?

萨克森-他的综合扩展函数?如何和地点?
EN

Stack Overflow用户
提问于 2015-10-28 13:18:03
回答 1查看 3.4K关注 0票数 6

虽然编写Saxon集成扩展函数对我来说非常清楚。

我有红色的:

  • http://www.saxonica.com/html/documentation/extensibility/integratedfunctions/
  • http://www.saxonica.com/html/documentation/extensibility/integratedfunctions/ext-simple-J.html

我很难找到如何让他们工作的信息。

问:在哪里放置文件,我是否必须复杂任何事情,我是否必须编辑撒克逊配置?基本上,除了向s9api处理器注册扩展函数之外,我还需要做些什么才能让它正常工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-03 14:56:05

TestMain.java -一些访问转换工厂的java文件

代码语言:javascript
复制
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import net.sf.saxon.TransformerFactoryImpl;
import net.sf.saxon.s9api.ExtensionFunction;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.jaxp.SaxonTransformerFactory;
import location.to.test.java.file.Test;

public class TestMain {
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {

        TransformerFactory factory = TransformerFactory.newInstance();

        // Grab the handle of Transformer factory and cast it to TransformerFactoryImpl
        TransformerFactoryImpl tFactoryImpl = (TransformerFactoryImpl) factory;

        // Get the currently used processor
        net.sf.saxon.Configuration saxonConfig = tFactoryImpl.getConfiguration();
        Processor processor = (Processor) saxonConfig.getProcessor();

        // Here extension happens, test comes from class Test -> Test.java
        ExtensionFunction test = new Test();
        processor.registerExtensionFunction(test);

        Source xslt = new StreamSource(new File("test.xsl"));
        Transformer transformer = factory.newTransformer(xslt);

        Source text = new StreamSource(new File("input.xml"));
        transformer.transform(text, new StreamResult(new File("result.xml")));
    }
}

Test.java -实际扩展函数逻辑

代码语言:javascript
复制
import net.sf.saxon.s9api.ExtensionFunction;
import net.sf.saxon.s9api.ItemType;
import net.sf.saxon.s9api.OccurrenceIndicator;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.SequenceType;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XdmValue;

public class Test implements ExtensionFunction {

    @Override
    public QName getName() {
        return new QName("http://some.namespace.com", "test");
    }

    @Override
    public SequenceType getResultType() {
        return SequenceType.makeSequenceType(ItemType.STRING, OccurrenceIndicator.ONE);
    }

    @Override
    public net.sf.saxon.s9api.SequenceType[] getArgumentTypes() {
        return new SequenceType[] {};
    }

    @Override
    public XdmValue call(XdmValue[] arguments) throws SaxonApiException {
        String result = "Saxon is being extended correctly.";
        return new XdmAtomicValue(result);
    }

}

test.xsl - test xsl.文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ext="http://some.namespace.com">
    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <root>
                <xsl:value-of select="ext:test()" />
        </root>
     </xsl:template>
</xsl:stylesheet>

result.xml -整个过程的结果

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>Saxon is being extended correctly.</root>

请注意,.java和.xsl文件中使用的命名空间必须相同,在QName中声明。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33392114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档