Ошибка инициализации с функцией расширения 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-файл представляет собой очень простую структуру (как вы можете себе представить) элемента, содержащего некоторые
ОБНОВЛЕНО Исправлена 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 ответ
Первой моей мыслью было, что вы просто не смогли зарегистрировать
Для диагностики такого рода проблем может оказаться полезным параметр -TJ в командной строке.
Я думаю, вы запутались, используя URI в имени вашей функции «java:TestPackage.TestClass», который указывает, что это функция рефлексивного расширения. Я не думаю, что это основная проблема, но это может привести к путанице в диагностике.
Кроме того, вы объявили функцию, возвращающую