Как расширить функциональность doc () в saxon - PullRequest
0 голосов
/ 09 июля 2019

Я ищу расширение функции doc (), доступной в настоящее время в SAXON таким образом, чтобы она считывала XML не из файловой системы или из сети http, а из памяти, где у меня есть эти xmls.

Я хочу использовать его следующим образом:

mydoc('id')/root/subroot/@myattr

или

doc('mydoc://id')/root/subroot/@myattr

Что я рассмотрел до сих пор:

  1. use queryEvaluator.setContextItem () - не решает мой вариант использования, так как я могу иметь несколько источников XML в одном запросе
  2. зарегистрировать некоторый собственный протокол схемы URL в Java - мне кажется излишним, и я никогда не делал этого
  3. написать собственную ExtensionFunction - кажется, правильный путь до сих пор, но я запутался, должен ли я использовать ExtensionFunction или скорее ExtensionFunctionDefinition.Также меня немного смущает исходный код Doc_1 и Doc Saxonica, так как он использует Atomizer и другие неизвестные внутренние компоненты.

Итак, вопросы:

  1. Является ли вариант 3 лучшим (в смысле простоты) или вы бы порекомендовали какой-то другой подход??
  2. Можно ли использовать ExtensionFunction и вернуть XdmNode из моего xmls в памяти?Мне кажется, это должно сработать, но я действительно не хочу вмешиваться в некоторые крайние случаи или саксонское минное поле.

Любой комментарий от опытного саксонского пользователя будет оценен.

1 Ответ

0 голосов
/ 09 июля 2019

Стандартный способ сделать это - написать URIResolver и зарегистрировать его в преобразователе. Вызывается URIResolver, предоставляя запрошенный URI, и ожидается, что он вернет источник (например, StreamSource, SAXSource или DOMSource). В этом сценарии вы обычно возвращаете StreamSource, упаковывающий StringReader, который упаковывает String, содержащий XML.

Вы также можете использовать функцию расширения, но, возможно, она немного сложнее.

...