2015-12-07 2 views
0

Я хочу добавить пользовательскую функцию расширения xpath к трансформатору Saxon-HE. Эта настраиваемая функция должна принимать один или несколько аргументов. Давайте используем аналогию конкатенации строк для конкатенации одного или нескольких аргументов строки. После пробы на саксонской странице, я написал следующий код:Как реализовать последовательность конкатенации, как функция расширения с неизвестными аргументами, используя Saxon-HE?

ExtensionFunction myconcat = new ExtensionFunction() { 
    public QName getName() { 
     return new QName("http://mycompany.com/", "myconcat"); 
    } 

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

    public net.sf.saxon.s9api.SequenceType[] getArgumentTypes() { 
     return new SequenceType[]{ 
      SequenceType.makeSequenceType(
       ItemType.STRING, OccurrenceIndicator.ONE_OR_MORE)}; 
    } 

    public XdmValue call(XdmValue[] arguments) throws SaxonApiException { 
     //concatenate the strings here.... 
     String result = "concatenated string";   
     return new XdmAtomicValue(result); 
    } 
}; 

я бы ожидать, что следующее выражение XPath будет работать в XSL файл

<xsl:value-of select="myconcat('a','b','c','...')"> 

К сожалению, я получил следующее исключение:

XPST0017: Function myconcat must have 1 argument 

Каков правильный способ создания пользовательской функции для этого варианта использования?

Спасибо.

+0

Такие аргументы называются varargs, а Saxon [по-видимому] (http://stackoverflow.com/questions/26237239/does-saxon-9-supports-java-varargs-in-extension-functions) не поддерживает эти аргументы. Возможный дублирующий вопрос. – predi

+0

Возможно, мне показалось, что это вопрос, основанный на размышлении. –

ответ

1

Стандартные механизмы для создания функций расширения не допускают переменного количества аргументов (на самом деле это не так, как pukka, чтобы иметь такие функции в представлении XPath мира) - concat() - очень исключение).

Вы можете сделать это, создав собственную реализацию класса FunctionLibrary и добавив свою функциональную библиотеку в статический контекст движка XSLT, но если вы попытаетесь сделать это глубоко, то вы глубоко погрузитесь в саксонские внутренности, поэтому будьте готовы к грубой поездке ,