【问题标题】:How to return document node from Saxon's extension function?如何从 Saxon 的扩展函数返回文档节点?
【发布时间】:2020-03-28 09:00:30
【问题描述】:

我正在查看 Saxon-HE 10 (Java) 中的 Integrated extension functions

我需要该函数返回由StreamSource 构造的document-node()?

similar question 的回答提到了这段代码:

context.getConfiguration().buildDocument()

但是context 没有传递给ExtensionFunction,只有XdmValue[] arguments

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

取而代之的是context.getConfiguration().buildDocumentTree(Source source),但我不知道如何将TreeInfo转换为接口签名所需的Sequence

【问题讨论】:

    标签: java xml xslt saxon


    【解决方案1】:

    “简单接口”(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,那么您需要使用带有单独 ExtensionFunctionDefinition 的“完整接口”和ExtensionFunctionCall 对象。

    然后您将需要使用较低级别的 Saxon 接口,例如 SequenceNodeInfoConfiguration.buildDocumentTree() 返回一个 TreeInfo,它有一个 getRootNode() 方法返回一个 NodeInfoNodeInfo 实现 Item 实现 Sequence,因此您可以从您的 ExtensionFunctionCall.call() 方法返回 NodeInfo

    【讨论】:

    • 谢谢。我想要一个单独的函数类,但我想我可以将Processor 传递给它的构造函数。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    相关资源
    最近更新 更多