我注册了不带参数的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/