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