То, что вы, вероятно, используете, это обычные пространства имен XQuery - вероятно, вы ищете модули. Вы можете поместить несколько функций в собственное пространство имен модуля, например:
module namespace foo = "http://www.myurl.com/foo";
declare function foo:bar($args as item()*) as item()* {
() (: do something cool :)
};
После этого вы можете импортировать модуль в свой основной запрос и вызвать функцию:
import module namespace foo = "http://www.myurl.com/foo";
foo:bar(<my-element/>)
Проблема в том, что не стандартизировано то, как процессор должен найти запрос. И я не знаю, как Saxon реализует механизм разрешения модулей (вы должны посмотреть документацию и / или написать в список рассылки Saxon).
Но большинство процессоров XQuery смотрят на путь, заданный предложением «at» относительно местоположения запроса. Итак, чтобы иметь что-то, что должно работать в большинстве реализаций: например, вы можете сохранить модуль в файле с именем foo.xq и поместить его в тот же каталог, что и ваш основной запрос, а затем для импорта модуля вы напишите:
import module namespace foo = "http://www.myurl.com/foo" at "foo.xq";
, который дает подсказку движку XQuery, где он должен искать модуль.
Вы можете найти некоторую (на данный момент небольшую) документацию об этом материале на http://www.xquery.me/ - надеюсь, это поможет.
EDIT
Хорошо, я вижу, вы хотите группировать только свои функции Для этого вы уже разобрались со всем, что вам нужно знать. Но я все же хочу подчеркнуть, что разбиение вашего запроса на модули, вероятно, было бы лучшим решением для вашего варианта использования (это просто несколько лучше, поскольку у вас больше модульности и в следующей рекомендации XQuery 3.0 у вас даже будет возможность поставить такие вещи, как частные функции и переменные там). Но если ваш запрос не становится большим, ваше решение, конечно, тоже хорошо.
Вы можете думать о пространствах имен XML так же, как и о пространствах имен в C ++. В XQuery функции, элементы, коллекции, переменные, атрибуты и т. Д. Могут находиться в собственном пространстве имен (опять же - как в C ++). Существуют некоторые неявно определенные пространства имен, такие как xs (пространство имен XML-схемы, где вы можете найти типы данных, такие как логические, целочисленные и т. Д.), Локальные (пространство имен, в которое вы можете помещать функции, чтобы вам не приходилось определять собственное пространство имен в основной запрос), fn (где определены все функции из рекомендации «Функции и операторы XQuery 1.0 и XPath 2.0»). Но префикс этой функции - только псевдоним - вы можете использовать все, что захотите.
Допустим, у вас есть следующий код в прологе вашего запроса:
declare namespace blubb = "http://www.w3.org/2001/XMLSchema";
blubb: integer будет точно такого же типа, как xs: integer - то же самое верно для функций:
declare namespace l = "http://www.w3.org/2005/xquery-local-functions";
С объявлением о том, что вы можете получить доступ к каждой функции в локальном пространстве имен с префиксом "l" (поэтому l: bar (), если local: bar () существует).
Если вы не введете префикс, XQuery предполагает, что эта функция находится в пространстве имен "fn". Вот почему бот
fn:concat("Hello ", "World!")
и
concat("Hello ", "World!")
эквивалентны. Вы можете изменить это поведение. Вы можете включить эту строку в пролог:
declare default function namespace "http://www.w3.org/2005/xquery-local-functions";
, который сообщает процессору XQuery, что вы не хотите ставить префикс локальных функций (поэтому bar () будет эквивалентен local: bar ()).
Я не уверен, что ответил на ваши вопросы или хотя бы смог внести некоторую ясность. Я не знаю об этом уроке (так как в начале это немного сбивает с толку, но в конце вы понимаете, что не о чем много говорить, поскольку механизмы намного проще, чем выглядят в первую очередь). Документ, в котором я всегда просматриваю материал, является рекомендацией по http://www.w3.org/TR/xquery/
Если это не поможет, попробуйте пройти отбор, и я могу попробовать еще раз с объяснением.