如何使用Saxon-HE实现具有未知参数编号的字符串连接相似的扩展函数?

时间:2015-12-07 11:33:32

标签: saxon

我想在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

为此用例创建自定义函数的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

创建扩展函数的标准机制不允许使用可变数量的参数(在世界的XPath视图中不具备这样的函数 - concat()非常例外)。

你可以通过创建自己的FunctionLibrary类实现并将你的FunctionLibrary添加到XSLT引擎的静态上下文来实现它 - 但是如果你尝试的话,你可以深入Saxon内部,所以要做好准备骑。