Как вернуть узел документа из функции расширения Саксона? - PullRequest
0 голосов
/ 28 марта 2020

Я смотрю на Интегрированные функции расширения в 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, требуемому сигнатурой интерфейса.

1 Ответ

2 голосов
/ 28 марта 2020

«Простой интерфейс» (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() метода.

...