Самый надежный способ проверить, является ли запрос пустым по вашему определению, - это рекурсивно пройти запрос, пока не встретится непустой элемент запроса, или, если нет, вернуть true.
Это немного проще сделать, сначала преобразовав запрос в XML:
declare function local:is-empty-query(
$q as schema-element(cts:query)*
)
{
if (empty($q)) then true()
else if (every $e in $q satisfies ($e/self::cts:and-query or $e/self::cts:or-query))
then local:is-empty-query($q/*)
else false()
};
local:is-empty-query(document { cts:and-query((cts:or-query((), ()))) }/*)
=> true()
local:is-empty(document { cts:and-query((cts:or-query((cts:word-query('test'), ())))) }/*)
=> false()