java - 如何从 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
解决方案
“简单接口” ( 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 接口,例如Sequence
和NodeInfo
。Configuration.buildDocumentTree()
返回 a TreeInfo
,它有一个getRootNode()
返回 a 的方法NodeInfo
。NodeInfo
implements Item
which implements Sequence
,所以你可以NodeInfo
从你的ExtensionFunctionCall.call()
方法返回。
推荐阅读
- python - selenium webriverwait 在没有描述的情况下引发错误
- batch-file - 为什么错误:不支持输入重定向,立即退出进程
- javascript - 找不到 React HTML 元素参考宽度和高度
- android - 使用协程在 Room 中的 ViewModel 中显示 LiveData
- scala - Spark - 从外部表创建 DataFrame
- java - 使用 Avro 序列化程序初始化 Kafka Producer 时出错:java.lang.NoClassDefFoundError
- react-native - 屏幕和标题在反应导航中闪烁
- angular - 在 Angular 中动态导入的组件中插入输入
- python - 访问python字典中最近的一年
- javascript - Javascript中的抽象语法树递归怎么样?