Я пытаюсь использовать настраиваемую встроенную функцию расширения с Saxon-HE 9.9.1.5, запускаемым из командной строки. При выполнении вызова я получаю сообщение об ошибке, что функция не может быть найдена (XPST0017: Cannot find a 0-argument function named Q{http://ramsen.no/saxon-extensions}random()
).
Я попытался настроить простой проект, следуя инструкциям в документации Saxon. У меня есть эти файлы:
- pom.xml
- hello.xml
- hello-world.xml
- src / main / java / no/ramsen/Transform.java
- src / main / java / no / ramsen / extensions / Random.java
После сборки с Maven я пытаюсь выполнить преобразование с этимкоманда. Я собрал банку со всеми зависимостями (maven-assembly-plugin
с jar-with-dependencies
), поэтому все должно быть включено. Я также установил основной класс Java в no.ramsen.Transform
.
java -jar target/integratedExtensionTest-1.0-SNAPSHOT.jar -TJ -t -s:hello.xml -xsl:hello-world.xsl
POM файл
<!-- Abbreviated... -->
<dependencies>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
<version>9.9.1-5</version>
</dependency>
</dependencies>
<!-- Abbreviated... -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>no.ramsen.Transform</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</plugin>
hello.xml
<?xml version="1.0" encoding="UTF-8"?>
<hello></hello>
hello-world.xsl
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ramsen="http://ramsen.no/saxon-extensions">
<xsl:output indent="yes" />
<xsl:template match="/">
<xsl:copy>
<xsl:text>Hello, </xsl:text>
<xsl:value-of select="ramsen:random()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
src / main / java / no / ramsen / Transform.java
public class Transform extends net.sf.saxon.Transform {
@Override
protected void applyLocalOptions(CommandLineOptions options, Configuration config) {
config.registerExtensionFunction(new Random());
super.applyLocalOptions(options, config);
}
}
src / main / java / no / ramsen / extensions / Random.java
public class Random extends ExtensionFunctionDefinition {
@Override
public StructuredQName getFunctionQName() {
return new StructuredQName("ramsen", "http://ramsen.no/saxon-extensions", "random");
}
@Override
public SequenceType[] getArgumentTypes() {
return new SequenceType[] {};
}
@Override
public SequenceType getResultType(SequenceType[] sequenceTypes) {
return SequenceType.SINGLE_DOUBLE;
}
@Override
public ExtensionFunctionCall makeCallExpression() {
return new ExtensionFunctionCall() {
@Override
public Sequence call(XPathContext xPathContext, Sequence[] sequences) {
return DoubleValue.makeDoubleValue(Math.random());
}
};
}
}
Я ожидал бы получить преобразование результата, что-то вроде этого:
<?xml version="1.0" encoding="UTF-8"?>
<hello>Hello, 0.5</hello>
Вместо этого я получаю сообщение об ошибке:
Saxon-HE 9.9.1.5J from Saxonica
Java version 11.0.5
Looking for function Q{http://ramsen.no/saxon-extensions}random#0
Trying net.sf.saxon.functions.registry.XSLT30FunctionSet
Trying net.sf.saxon.style.StylesheetFunctionLibrary
Trying net.sf.saxon.functions.FunctionLibraryList
Looking for function Q{http://ramsen.no/saxon-extensions}random#0
Trying net.sf.saxon.functions.registry.VendorFunctionSetHE
Trying net.sf.saxon.functions.MathFunctionSet
Trying net.sf.saxon.ma.map.MapFunctionSet
Trying net.sf.saxon.ma.arrays.ArrayFunctionSet
Trying net.sf.saxon.functions.registry.ExsltCommonFunctionSet
Function Q{http://ramsen.no/saxon-extensions}random not found!
Trying net.sf.saxon.functions.registry.ConstructorFunctionLibrary
Trying net.sf.saxon.query.XQueryFunctionLibrary
Trying net.sf.saxon.functions.IntegratedFunctionLibrary
Trying net.sf.saxon.style.StylesheetFunctionLibrary
Function Q{http://ramsen.no/saxon-extensions}random not found!
Static error in {ramsen:random()} in expression in xsl:value-of/@select on line 8 column 54 of hello-world.xsl:
XPST0017: Cannot find a 0-argument function named Q{http://ramsen.no/saxon-extensions}random()
Errors were reported during stylesheet compilation
Используя IntelliJ, я устанавливаю точку остановав файле src/main/java/no/ramsen/Transform.java
, в методе applyLocalOptions
. Эта точка останова никогда не достигается;Я подозреваю, что мне не удалось зарегистрировать мою функцию расширения?