Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Отличие целевого пространства имён от пространства имён по умолчанию

Подскажите, пожалуйста, в чём заключается отличие целевого пространства имён (targetNamespace) от пространства имён по умолчанию? Заранее спасибо!


Ответ

После продолжительных раздумий, как это сформулировать, я нашёл пожалуй лучшее описание. Переведу его на русский.

Рассмотрим три схемы XSD. Все они определяют один глобальный тип и один глобальный элемент, который ссылается на этот тип.
Первая использует префикс 'xsd' для пространства имён самой схемы и пространство имён по умолчанию для targetNamespace



Теперь та же схема, но определяющая и использующая префикс для целевого пространства имён:



И, наконец, версия, которая использует пространство имён по умолчанию вместо 'xsd' для пространства имён самой XML-схемы:



Большинство авторов схем выбирают первую или последнюю, ведь если пространство имён по умолчанию доступно, то мы можем использовать его для чего-нибудь ещё.

Кратко: пространство имён по умолчанию (xmlns без префикса) используется в самой XML-схеме Целевое пространство имён (targetNamespace) указывает, в каком неймспейсе должны быть элементы в XML-документе, который валидируется этой схемой.

Со всем этим этим проще разобраться, если использовать хороший редактор xml. Например, редактор из состава Visual Studio выдаёт следующее (используем третий вариант схемы):
Если убрать targetNamespace подчёркивает element с ошибкой:
Namespace 'http://example.com' is not available to be referenced in this schema
То есть он видит, что aGlobalType объявлен в этом пространстве имён. Но не знает, в каком пространстве имён этот тип должен быть в целевом документе (который будет валидироваться этой схемой). Если вдобавок к этому убрать префикс tns, то ошибка:
Type 'http://www.w3.org/2001/XMLSchema:aGlobalType' is not declared.
Ну, тот понятно: без префикса наш тип попадает в то же пространство имён, что и элементы схемы. А среди них нет 'aGlobalType'.
Вернём схему в рабочий вид (любая из трёх версий). Открываем документ, который валидируется этой схемой. Печатаем символ < - при этом редактор покажет список разрешённых элементов. Выбираем наш aGlobalElement, жмём TAB - вставится следующее определение:
Если вместо этого напечатать Становится понятно, что этот элемент обязан быть именно в этом пространстве имён (targetNamespace), чтобы документ являлся валидным в соответствии с нашей схемой.

Комментариев нет:

Отправить комментарий