首页 > 解决方案 > 如何从 Saxon 的扩展函数返回文档节点?

问题描述

我正在查看Saxon-HE 10 (Java) 中的集成扩展功能

我需要该函数返回一个document-node()?StreamSource.

类似问题的回答提到了这段代码:

context.getConfiguration().buildDocument()

不过context不是传给ExtensionFunction,只是XdmValue[] arguments

ExtensionFunctionDefinition确实接受XPathContext context,但看起来getConfiguration().buildDocument()在 10 中不存在。

相反,有context.getConfiguration().buildDocumentTree(Source source),但我不知道如何将其转换为接口签名所需的TreeInfo返回值。Sequence

标签: javaxmlxsltsaxon

解决方案


“简单接口” ( s9api.ExtensionFunction) 不允许传入 XPathContext 对象。但是,为此您不需要完整的 XPath 动态上下文;您只需要访问配置对象。事实上,您可以在 s9api 级别上做所有事情,而无需深入了解 Saxon 内部结构:

    final Processor proc = new Processor();
    ExtensionFunction ef = new ExtensionFunction() {
          ...
          public XdmValue call(XdmValue[] arguments) throws SaxonApiException {
              Source source = ...;
              return proc.newDocumentBuilder().build(source);           
          }
      };    
    proc.registerExtensionFunction(ef);

如果您确实需要比这更多的上下文信息,例如,如果您需要访问调用扩展函数的表达式的静态基本 URI,那么您需要使用带有单独ExtensionFunctionDefinitionExtensionFunctionCall对象的“完整接口”。

然后,您将需要使用较低级别的 Saxon 接口,例如SequenceNodeInfoConfiguration.buildDocumentTree()返回 a TreeInfo,它有一个getRootNode()返回 a 的方法NodeInfoNodeInfoimplements Itemwhich implements Sequence,所以你可以NodeInfo从你的ExtensionFunctionCall.call()方法返回。


推荐阅读