Как импортировать общие пространства имен модулей в xquery

У меня есть несколько файлов xquery пространства имен модулей, которые использовались в нескольких файлах. Я хочу иметь пространства имен в одном общем файле xquery и импортировать этот файл, где бы я ни хотел использовать.

Скажите, например,

У меня process-lib.xqy, util-lib.xqy и query-lib.xqy. Раньше я импортировал их в несколько файлов, например,

import module namespace util = "util" at "util-lib.xqy";
import module namespace process = "process" at "process-lib.xqy";
import module namespace query = "query" at "query-lib.xqy";

Теперь я попытался использовать их в одном общем файле с именем common-import.xqy и импортировать этот файл в несколько файлов.

когда я попробовал этот подход,

import module namespace common-import= "common-import" at "common-import.xqy";

Выдает исключение как prefix util has no namespace binding.

Как этого добиться?


person Community    schedule 29.10.2015    source источник
comment
Я думаю, вы говорите, что common-import.xqy импортирует утилиту, процесс и запрос, а затем в каком-то другом модуле XQuery вы импортируете только common-import и пытаетесь вызвать функцию пространства имен util. Это правильно?   -  person Dave Cassel    schedule 29.10.2015
comment
да, Дэйв. Ты прав. Можем ли мы этого добиться ????   -  person    schedule 30.10.2015
comment
См. Ответ Диркка, вот что я собирался написать.   -  person Dave Cassel    schedule 30.10.2015


Ответы (1)


Это невозможно, по крайней мере, не так, как вы хотите, и это правильно. Спецификация XQuery не допускает этого:

Module imports are not transitive—that is, importing a module provides access only to function and variable declarations contained directly in the imported module. For example, if module A imports module B, and module B imports module C, module A does not have access to the functions and variables declared in module C.

Это обдуманное дизайнерское решение. Если вы хотите получить доступ таким образом, вы можете написать функцию-оболочку для каждой функции, к которой вы хотите получить доступ, например в вашем common-import.xqy файле вы могли бы иметь:

declare function common-import:test() { 
  util:test() 
};

Но, конечно, для этого может потребоваться огромное количество функций-оберток. Я бы порекомендовал вам просто вставить все необходимые библиотеки. Я не вижу в этом никакой пользы.

person dirkk    schedule 30.10.2015