2017-01-28 3 views
0

Я пытаюсь добавить функцию расширения, но терпит неудачу с:функция расширения с помощью саксонского s9api

Caused by: net.sf.saxon.trans.XPathException: Unknown system function follow() 
    at net.sf.saxon.expr.parser.XPathParser.grumble(XPathParser.java:282) 

Я вижу (в отладке) этой функцией зарегистрированной с помощью встроенной библиотеки. Я ожидал, что саксон будет искать функцию в интегрированной библиотеке, но это поиск в системных функциях и ошибка бросания. Что вызывает представление этой функции в виде системной функции. Я использую следующие:

<dependency> 
    <groupId>net.sf.saxon</groupId> 
    <artifactId>Saxon-HE</artifactId> 
    <version>9.7.0-14</version> 
</dependency> 

Спасибо

мой код

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; 
      } 
     } 
    } 
} 
+0

связано с префиксом ""? Я попытался с новым ExtensionFunction() {} и объявил непустой префикс, и он сработал. – user19937

+0

Да, я подозреваю, что так. Без префикса он, вероятно, рассматривает его как находящееся в пространстве имен по умолчанию для функций, которое является пространством имен fn. –

ответ

1

В выражении XPath вы написали

follow(/a/b/c) 

имя функции без каких-либо имен Предполагается, что префикс находится в пространстве имен по умолчанию для функций, которые по умолчанию это пространство имен системных функций http://www.w3.org/2005/xpath-functions. Вам нужно использовать префикс, привязанный к URI, появляющийся в определении функции расширения, а именно: http://example.com/saxon-extension

Смежные вопросы