«Простой интерфейс» (s9api.ExtensionFunction
) не позволяет передавать объект XPathContext. Однако для этого вам не нужен полный контекст XPath dynamici c; вам нужен только доступ к объекту конфигурации. На самом деле вы можете делать все на уровне s9api, не вдаваясь в саксонские внутренности:
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 stati c Выражение, из которого вызывается ваша функция расширения, вам нужно использовать «полный интерфейс» с отдельными ExtensionFunctionDefinition
и ExtensionFunctionCall
объектами.
Затем вам нужно будет использовать саксонские интерфейсы более низкого уровня, такие как Sequence
и NodeInfo
. Configuration.buildDocumentTree()
возвращает TreeInfo
, у которого есть метод getRootNode()
, возвращающий NodeInfo
. NodeInfo
реализует Item
, который реализует Sequence
, поэтому вы можете вернуть NodeInfo
из вашего ExtensionFunctionCall.call()
метода.