Я бы рекомендовал использовать интерфейс s9api (классы, такие как XdmValue
, XdmAtomicValue
, XdmNode
), а не интерфейсы более низкого уровня (классы, такие как NodeInfo
, Int64Value
, Sequence
), потому чтонизкоуровневые интерфейсы создают слишком большую внутреннюю сложность и не настолько стабильны между выпусками.
На уровне s9api вы можете скомпилировать запрос, используя XQueryCompiler.compile()
, чтобы вернуть XQueryExecutable
;вызовите load()
для этого, чтобы получить XQueryEvaluator
, а затем вызовите callFunction()
для этого, чтобы вызвать определенную функцию XQuery.Метод callFunction()
принимает аргументы и возвращает результаты в виде XdmValue
экземпляров.Если запрос возвращает узел, он будет в форме экземпляра XdmNode
, и вы можете выполнить дополнительный запрос для этого XdmNode
, установив его в качестве элемента контекста для другого запроса, используя XQueryEvaluator.setContextItem()
.
Если вы хотите использовать интерфейс более низкого уровня, Sequence
- это интерфейс, и вам нужно будет выбрать конкретную реализацию.Для последовательности, которая является единственным узлом, подинтерфейс NodeInfo
подходит;но вы должны знать, что когда функция возвращает один узел, она не обязательно будет возвращена как экземпляр NodeInfo
, это может быть, например, LazySequence
, чей метод head()
необходимо вызвать для полученияNodeInfo
.Вы действительно не хотите связываться с такими сложностями, если можете избежать этого;так что используйте s9api.