XSD недействителен без префикса

У меня есть прикрепленный main.xsd, который импортирует types.xsd. Откройте это в XmlSpy (или аналогичном), и main.xsd будет проверять очень хорошо. Однако, если префикс пространства имен ns0 удаляется из объявления, он не будет проверяться, даже если префикс нигде не используется.

Хорошо:<xs:schema xmlns:ns0="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data"

Плохой:<xs:schema xmlns="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data"

Сообщение об ошибке проверки:"Cannot resolve declaration or definition 'ArrayOfString' in namespace 'http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data'"

Может кто-нибудь объяснить, почему требуется префикс?

Хороший файл: GoodMain.xsd Плохой файл: BadMain.xsd Импортированные типы xsd: Types.xsd

2 ответа

Решение

Определяя "xmlns=", я говорил, что любые неквалифицированные элементы будут принадлежать этому пространству имен по умолчанию. Проблема заключалась в том, что у меня не было атрибута "targetNamespace =" для схемы, а затем пространство имен, для которого целевое пространство имен по умолчанию не существовало.

Теперь я определил XSD следующим образом:

<xs:schema targetNamespace="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data" xmlns="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:q2="http://microsoft.com/wsdl/types/" elementFormDefault="unqualified" attributeFormDefault="unqualified">

Полный файл здесь: best.xsd

Если префикс пространства имен ns0 нигде не используется, тогда вы можете безопасно удалить объявление пространства имен xmlns:ns0="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data"

Что вы не можете сделать, это заменить его другим объявлением пространства имен, xmlns="http://schemas.asidua.com/CCP/IntegrationServices/2011-11-18/Data", Это меняет пространство имен по умолчанию, которое меняет значение всех нефиксированных имен в документе схемы.

Обновление в ответ на комментарии: более конкретно, если в схеме объявлено пространство имен D по умолчанию, то объявлены глобально элементы, типы и т. Д. (<element name="x"/>) будет находиться в targetNamespace схемы, а имена, ссылающиеся на элементы или типы (type="x", ref="x") будет находиться в пространстве имен D. Это будет вызывать проблемы, если D не совпадает с targetNamespace.

(Между прочим, это не называется "псевдонимом". Вас лучше поймут, если использовать правильную терминологию.)

Другие вопросы по тегам