首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用saxon s9api的扩展函数

使用saxon s9api的扩展函数
EN

Stack Overflow用户
提问于 2017-01-28 10:47:52
回答 1查看 454关注 0票数 0

我正在尝试添加一个扩展函数,但失败了:

代码语言:javascript
复制
Caused by: net.sf.saxon.trans.XPathException: Unknown system function follow()
    at net.sf.saxon.expr.parser.XPathParser.grumble(XPathParser.java:282)

我看到(在debug中)向集成库注册的函数。我期望saxon在集成库中查找函数,但它在系统函数中搜索并抛出错误。导致此函数被表示为系统函数的原因。我正在使用以下内容:

代码语言:javascript
复制
<dependency>
   <groupId>net.sf.saxon</groupId>
   <artifactId>Saxon-HE</artifactId>
   <version>9.7.0-14</version>
</dependency>

谢谢

我的代码是

代码语言:javascript
复制
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.XPathCompiler;
import net.sf.saxon.s9api.XPathExecutable;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.SequenceType;

public class FollowTest {
    public static void main(String[] args) throws Exception {
        new FollowTest().test();
    }

    private void test () throws Exception {
        Processor proc = new Processor(false);
        proc.registerExtensionFunction(new Follow());
        XPathCompiler xx = proc.newXPathCompiler();
        XPathExecutable x = xx.compile("follow(/a/b/c)/type='xyz'");
    }

    public class Follow extends ExtensionFunctionDefinition {

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

        @Override
        public int getMinimumNumberOfArguments() {
            return 1;
        }

        @Override
        public int getMaximumNumberOfArguments() {
            return 1;
        }

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

        @Override
        public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) {
            return SequenceType.NODE_SEQUENCE;
        }

        @Override
        public boolean trustResultType() {
            return true;
        }

        @Override
        public boolean dependsOnFocus() {
            return false;
        }

        @Override
        public boolean hasSideEffects() {
            return false;
        }

        @Override
        public ExtensionFunctionCall makeCallExpression() {
            return null;
        }
        private class followCall extends ExtensionFunctionCall {
            @Override
            public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
                return null;
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-28 22:44:52

在您编写的XPath表达式中

代码语言:javascript
复制
follow(/a/b/c)

不带命名空间前缀的函数名被假定在函数的默认命名空间中,默认情况下是系统函数命名空间http://www.w3.org/2005/xpath-functions。您需要使用绑定到扩展函数定义中出现的URI的前缀,即http://example.com/saxon-extension

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

https://stackoverflow.com/questions/41905858

复制
相关文章

相似问题

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