我想在Saxon-HE变换器中添加自定义xpath扩展功能。此自定义函数应接受一个或多个参数。让我们使用字符串连接类比来连接一个或多个字符串参数。在saxon页面上的示例之后,我编写了以下代码:
ExtensionFunction myconcat = new ExtensionFunction() {
public QName getName() {
return new QName("http://mycompany.com/", "myconcat");
}
public SequenceType getResultType() {
return SequenceType.makeSequenceType(
ItemType.STRING, OccurrenceIndicator.ONE
);
}
public net.sf.saxon.s9api.SequenceType[] getArgumentTypes() {
return new SequenceType[]{
SequenceType.makeSequenceType(
ItemType.STRING, OccurrenceIndicator.ONE_OR_MORE)};
}
public XdmValue call(XdmValue[] arguments) throws SaxonApiException {
//concatenate the strings here....
String result = "concatenated string";
return new XdmAtomicValue(result);
}
};
我预计以下xpath表达式可以在xsl文件中使用
<xsl:value-of select="myconcat('a','b','c','...')">
不幸的是我得到了以下例外:
XPST0017: Function myconcat must have 1 argument
为此用例创建自定义函数的正确方法是什么?
感谢。
答案 0 :(得分:1)
创建扩展函数的标准机制不允许使用可变数量的参数(在世界的XPath视图中不具备这样的函数 - concat()非常例外)。
你可以通过创建自己的FunctionLibrary类实现并将你的FunctionLibrary添加到XSLT引擎的静态上下文来实现它 - 但是如果你尝试的话,你可以深入Saxon内部,所以要做好准备骑。