Ошибка инициализации с функцией расширения Java Saxon HE в Oxygen XML

Я пытаюсь научиться создавать функции расширения для XSLT, используя Java и Saxon-HE, используя класс ExtensionFunctionDefinition . До сих пор мне удавалось извлечь, а затем перекомпилировать .jar с помощью плагина Oxygen DITA-OT для преобразования Latex в SVG . Это отлично работает, когда я добавляю необходимые файлы jar в качестве расширений и преобразую входную строку, как ожидалось.

Я чувствую, что проблема должна быть чем-то чрезвычайно простым (и, по общему признанию, я очень неопытен в написании языка Java).

Однако когда я делаю несколько довольно простых изменений в коде Java, чтобы просто объединить строки, я получаю очень невзрачную ошибку:.

Вот моя Java:

      package TestPackage;

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.trans.XPathException;
import net.sf.saxon.value.SequenceType;
import net.sf.saxon.value.StringValue;

public class TestClass extends ExtensionFunctionDefinition {
    @Override
    public StructuredQName getFunctionQName() {
        return new StructuredQName("ex-ns", "http://www.example.com/test-class", "function");
    }
    
    @Override
    public SequenceType[] getArgumentTypes() {
        return new SequenceType[] { SequenceType.SINGLE_STRING };
    }
    
    @Override
    public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) {
        return SequenceType.VOID;
    }
    
    @Override
    public ExtensionFunctionCall makeCallExpression() {
        return new ExtensionFunctionCall() {
            @Override
            public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
                String str1 = "Hello ";
                String str2 = "!";
                String first = arguments[0].head().getStringValue();
                String result = str1.concat(first).concat(str2);
                return StringValue.makeStringValue(result);
            }
        };
    }
}

и вот моя таблица стилей для преобразования:

      <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:saxon="http://saxon.sf.net/"
    xmlns:ex-ns="http://www.example.com/test-class">
    
    <xsl:template match="/doc">
        <xsl:message>Doc here!</xsl:message>
        <doc>
            <xsl:apply-templates/>
        </doc>
    </xsl:template>
    
    <xsl:template match="//name">
        <xsl:variable name="first-name" as="xs:string" select="@first"/>
        <xsl:variable name="last-name" as="xs:string" select="@last"/>
        <name>
            <xsl:copy-of select="mine:function($first-name)"/>
        </name>
    </xsl:template>
</xsl:stylesheet>

Входной XML-файл представляет собой очень простую структуру (как вы можете себе представить) элемента, содержащего некоторыедочерние элементы. Я ожидал, что каждый элемент будет преобразован в пример Hello!, но вместо этого я просто получаю вышеуказанную ошибку. Кроме того, похоже, что Saxon-HE (или любая другая версия Saxon, это не имеет значения) выдает эту ошибку при чтении файла jar перед любыми преобразованиями. То есть сообщение «Док здесь!» никогда не создается до появления ошибки.

ОБНОВЛЕНО Исправлена ​​Java на основе комментариев ниже (фрагмент). Используйте общедоступный класс и стандартные форматы для StructuredQName():

      public class TestClass extends ExtensionFunctionDefinition {
    @Override
    public StructuredQName getFunctionQName() {
        return new StructuredQName("ex-ns", "http://www.example.com/test-class", "function");
    }

Исправлен XSLT для использования с этим исправлением. Обратите внимание, как xmlns использует значения, объявленные в StructureQName:

      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:saxon="http://saxon.sf.net/"
    xmlns:ex-ns="http://www.example.com/test-class">

...
        <name>
            <xsl:copy-of select="ex-ns:function($first-name)"/>
        </name>

1 ответ

Первой моей мыслью было, что вы просто не смогли зарегистрироватьс процессором Saxon, например, вызвав. Но я думаю, что это даст вам другую диагностику.

Для диагностики такого рода проблем может оказаться полезным параметр -TJ в командной строке.

Я думаю, вы запутались, используя URI в имени вашей функции «java:TestPackage.TestClass», который указывает, что это функция рефлексивного расширения. Я не думаю, что это основная проблема, но это может привести к путанице в диагностике.

Кроме того, вы объявили функцию, возвращающую, но ваша таблица стилей пытается использовать результат, но это не удается. Функцию следует изменить, чтобы объявить ее фактический тип результата,.

Другие вопросы по тегам