我注册了不带参数的ExtensionFunctionDefinition,但无法调用它。
有什么问题,如何解决?
看起来功能未注册。
这是代码:

撒克逊人

     ...<saxon.he.version>9.7.0-3</saxon.he.version>...
        <groupId>net.sf.saxon</groupId>
        <artifactId>Saxon-HE</artifactId>...


例外

Error at char 29 in xsl:value-of/@select on line 23 column 71
XTDE1425: Cannot find a matching 0-argument function named {http://date.com}getFormattedNow()
in built-in template rule


XSLT

<xsl:stylesheet ...
            xmlns:dateService="http://date.com"
            exclude-result-prefixes="dateService" version="1.0">
...
            <xsl:value-of select="dateService:getFormattedNow()"/>


扩展功能定义

public class DateExtensionFunction extends ExtensionFunctionDefinition {
public StructuredQName getFunctionQName() {
    return new StructuredQName("", "http://date.com", "getFormattedNow");
}

public SequenceType[] getArgumentTypes() {
    return new SequenceType[]{SequenceType.OPTIONAL_STRING};
}

public SequenceType getResultType(SequenceType[] sequenceTypes) {
    return SequenceType.SINGLE_STRING;
}

public boolean trustResultType() {
    return true;
}

public int getMinimumNumberOfArguments() {
    return 0;
}

public int getMaximumNumberOfArguments() {
    return 1;
}

public ExtensionFunctionCall makeCallExpression() {
    return new ExtensionFunctionCall() {

        public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
                return new StringValue("TEST");
        }
    };
}
}


变压器

    Processor processor = new Processor(false);
    Configuration configuration = new Configuration();
    TransformerFactoryImpl transformerFactory = new TransformerFactoryImpl();
    processor.registerExtensionFunction(new DateExtensionFunction());
    configuration.setProcessor(processor);
    transformerFactory.setConfiguration(configuration);
    //...newTransformer

最佳答案

您的Processor,Configuration和TransformerFactory之间的关系错误。

最好将配置视为保存所有重要数据,并把Processor和TransformerFactory视为API贴面,放在配置之上。

创建处理器时,它会在下面创建自己的配置。与TransformerFactoryImpl相同。因此,这里有三个Configuration对象,即Saxon创建的两个对象和您创建的一个对象。扩展功能已在配置(s9api)处理器的配置中注册,该配置与您在JAXP TransformerFactory中使用的处理器无关。

我建议您使用JAXP或s9api,但避免混合使用。如果要使用JAXP,请执行以下操作:

    TransformerFactoryImpl transformerFactory = new TransformerFactoryImpl();
    Configuration config = transformerFactory.getConfiguration();
    config.registerExtensionFunction(new DateExtensionFunction());


请注意,从Saxon 9.7开始,JAXP接口被实现为s9api接口之上的一层。

关于java - 内置模板规则中找不到名为{NAME} METHOD()的匹配0参数的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36008426/

10-11 05:12