Почему в элементе "attribute" нельзя использовать свойство "ref" в XSD-файле?
Почему при использовании элемента attribute через свойство ref в XSD-файле мы получаем ошибки в IntellijIDEA такого плана:
Attribute 'country' is not allowed to appear in element 'tariff'.
Attribute 'country' must appear on element 'tariff'.
Хотя, согласно официальной документации, цитата:
Он (элемент
attribute) определяет простое определение типа для атрибута либо по ссылке, либо явно, и может предоставлять информацию по умолчанию.
В приведенном ниже исходном коде xsd-файла видно, что элемент attribute с именем coutry является глобальным. Официальная документация говорит нам по этому поводу вот что:
Глобальные элементы и глобальные атрибуты - создаются с помощью объявлений, которые являются дочерними элементами элемента
schema. На глобальный элемент или глобальный атрибут можно сослаться с помощью параметра ref в одном или более объявлениях.
Вот сам xsd-файл, данная проблема в котором решается с помощью использования элемента simpleType с именем country:
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.by/namespace"
xmlns:namespace="http://example.by/namespace"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- root element -->
<element name="tariffs">
<complexType>
<sequence>
<element name="tariff" type="namespace:tariff" minOccurs="16" maxOccurs="unbounded" />
</sequence>
</complexType>
</element>
<!-- tariff -->
<complexType name="tariff">
<sequence>
<element name="information" type="string" />
<element name="operator" type="string" />
<element name="prices" type="string" />
<element name="parameters" type="string" />
</sequence>
<attribute name="coutry" type="namespace:countryType" use="required" />
</complexType>
<simpleType name="countryType">
<restriction base="ID">
<length value="6" />
</restriction>
</simpleType>
</schema>
А вот с таким XSD-файлом получается ошибка, которая описана выше:
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.by/namespace"
xmlns:namespace="http://example.by/namespace"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- root element -->
<element name="tariffs">
<complexType>
<sequence>
<element name="tariff" type="namespace:tariff" minOccurs="16" maxOccurs="unbounded" />
</sequence>
</complexType>
</element>
<!-- tariff -->
<complexType name="tariff">
<sequence>
<element name="information" type="string" />
<element name="operator" type="string" />
<element name="prices" type="string" />
<element name="parameters" type="string" />
</sequence>
<attribute ref="namespace:coutry" use="required" />
</complexType>
<attribute name="coutry">
<simpleType>
<restriction base="ID">
<length value="6" />
</restriction>
</simpleType>
</attribute>
</schema>
А вот так выглядит часть XML-файла, которая не проходит валидацию:
<operator country="BY">
<simpleName>MTS</simpleName>
<fullName>Mobile TeleSystems JLLC</fullName>
</operator>
Ответы (1 шт):
Ваша проблема из-за того, что вы не используете префикс для пространства имён схемы: xmlns="http://www.w3.org/2001/XMLSchema".
В итоге элементы без префикса имеют это пространство имён по умолчанию. Но атрибуты в xml не могут иметь пространства имён по умолчанию! Поэтому они оказываются вне его.
Цитата из спецификации XML:
A default namespace declaration applies to all unprefixed element names within its scope. Default namespace declarations do not apply directly to attribute names; the interpretation of unprefixed attributes is determined by the element on which they appear.
Если вы упорно желаете не использовать префикс, то вам придётся вынести определения типов в другую схему (в другом файле) и импортировать её в основную схему.