Java 如何从Saxon';s扩展函数?
我正在看撒克逊HE 10(Java) 我需要函数返回一个Java 如何从Saxon';s扩展函数?,java,xml,xslt,saxon,Java,Xml,Xslt,Saxon,我正在看撒克逊HE 10(Java) 我需要函数返回一个document-node()?,它是从StreamSource构建的 对a的回答提到了该代码: context.getConfiguration().buildDocument() 但是,context不会传递给ExtensionFunction,只有XdmValue[]参数 ExtensionFunctionDefinition不接受XPathContext,但它看起来像getConfiguration()。buildDocument
document-node()?
,它是从StreamSource
构建的
对a的回答提到了该代码:
context.getConfiguration().buildDocument()
但是,context
不会传递给ExtensionFunction
,只有XdmValue[]参数
ExtensionFunctionDefinition
不接受XPathContext
,但它看起来像getConfiguration()。buildDocument()
在10中不存在
相反,有context.getConfiguration().buildDocumentTree(源代码)
,但我不知道如何转换TreeInfo
它返回到接口签名所需的序列。简单接口(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()
返回一个TreeInfo
,它有一个getRootNode()
方法返回一个NodeInfo
NodeInfo
实现了实现序列的项,因此您可以从ExtensionFunctionCall.call()
方法返回NodeInfo
。简单接口(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()
返回一个TreeInfo
,它有一个getRootNode()
方法返回一个NodeInfo
NodeInfo
实现了项,该项实现了序列
,因此您可以从扩展函数call.call()
方法返回NodeInfo
。谢谢。我想要一个单独的函数类,但是我想我可以把处理器
传递到它的构造函数中。谢谢。我希望函数有一个单独的类,但我想我可以将处理器
传递到它的构造函数中。