Как работают пространства имен функций XQuery? - PullRequest
3 голосов
/ 26 июня 2011

РЕДАКТИРОВАТЬ

Я хочу сгруппировать связанные функции, чтобы показать, что они связаны.

Если у меня есть local:f1() и local:f2(), тогда я мог бы простоизмените их имена на local:menu-f1() и local:menu-f2(), но есть ли в языке XQuery механизм для группировки связанных функций?

OP

Я очень рад узнать,что функции XQuery могут быть объявлены в пространстве имен, отличном от local:.Где я могу найти информацию о том, как это работает?

Всегда объявляя функции таким образом;

declare function local:foo() {
   3+4
};

.. и используя их таким образом;

local:foo()

.. Я обнаружил, что они могут быть объявлены так:

declare namespace baz = "fred:bloggs";
declare function baz:foo() {
   3+4
};

.. и использованы так;

baz:foo()

Но я могу найти только справочную информацию о declare namespace и declare function отдельно, не похожая на учебник информация о том, как вообще работают пространства имен функций XQuery.

Есть ли новичок в руководстве по пространствам имен функций XQuery?

Я использую саксонский процессор- XQuery 1.0.

1 Ответ

6 голосов
/ 26 июня 2011

То, что вы, вероятно, используете, это обычные пространства имен 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/

Если это не поможет, попробуйте пройти отбор, и я могу попробовать еще раз с объяснением.

...