Как использовать встроенную функцию расширения из командной строки с Saxon-HE - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь использовать настраиваемую встроенную функцию расширения с 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. Эта точка останова никогда не достигается;Я подозреваю, что мне не удалось зарегистрировать мою функцию расширения?

...