Попробуйте объявить и использовать ваши типы отдельно. Это делает XSD немного длиннее, но менее вложенным и более читаемым (и более многократно используемым):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- document element -->
<xs:element name="Lista" type="listaType" />
<!-- type definitions -->
<xs:complexType name="listaType">
<xs:sequence>
<xs:element name="Pelicula" type="peliculaType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="count" type="countType" />
</xs:complexType>
<xs:complexType name="peliculaType">
<xs:all>
<xs:element name="Genero" type="generoType" />
<xs:element name="Director" type="directorType" />
<xs:element name="Temporada" type="temporadaType" />
</xs:all>
<xs:attribute name="nombre" type="xs:string" />
</xs:complexType>
<xs:complexType name="directorType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="sexo" type="sexoType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="temporadaType">
<xs:all>
<xs:element name="Anho" type="anhoType" />
<xs:element name="Semestre" type="semestreType" />
</xs:all>
</xs:complexType>
<xs:simpleType name="sexoType">
<xs:restriction base="xs:string">
<xs:enumeration value="F" />
<xs:enumeration value="M" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="generoType">
<xs:restriction base="xs:string">
<xs:enumeration value="Drama" />
<xs:enumeration value="Accion" />
<xs:enumeration value="Romance" />
<xs:enumeration value="Ficcion" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="semestreType">
<xs:restriction base="xs:string">
<xs:enumeration value="Verano" />
<xs:enumeration value="Invierno" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="anhoType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1970" />
<xs:maxInclusive value="2020" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="countType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
Вышеуказанный код проверяет ваш входной XML.
Обратите внимание, что:
- Соглашение для префикса пространства имен схемы XML:
xs
(AFAIK - вы все равно можете продолжить и использовать xsd
, если хотите).
- Атрибут
count
действительно не нужен, так как счет может а) легко рассчитываться и б) существует риск, что что-то пойдет не так, когда значение атрибута count
и фактическое количество по какой-то причине различаются. Вещи, которые можно извлечь из данных, никогда не должны быть частью данных.
Да, и ответить на ваш первоначальный вопрос (почему мой не работает):
- Вы никогда не объявляете фактический элемент документа ("Lista"), вы просто объявляете его тип. Сравните с моим решением.
- В
complexType name="Lista"
:
attribute
не может быть первым потомком сложного типа. Атрибуты должны быть объявлены после всего остального.
complexContent
не может содержать element
.
- , вам вообще не нужно
complexContent
- просто используйте sequence
.
- В
element name="Pelicula"
:
- Атрибут
type
недопустим, когда вы объявляете complexType
в пределах.
- В
complexType
для "Pelicula"
:
- Опять же, последние атрибуты.
- Не используйте
sequence
, если вы не хотите, чтобы любой другой заказ детей был незаконным. В этом типе документа я бы предположил, что детский порядок не имеет значения.
- В
element name="Director"
:
- Вы не можете объявить какие-либо атрибуты с тех пор, как вы уже объявили
type
. Включите атрибут sexo
в directorType
- В
simpleType name="directorType"
:
- В действительности это должен быть
complexType
, содержащий simpleContent
с extension
. Таким образом, вы можете включить атрибут sexo
- Ваш XSD даже не является правильно сформированным XML.
- Ваш XML является также не был правильно сформирован. Я исправил это, чтобы иметь возможность проверить в первую очередь.
P.S .: Существует достаточно свободно доступной документации по XSD, чтобы исправить многие из ваших основных проблем. В сети есть валидаторы XSD, которые помогают вам сообщать, какие конструкции являются незаконными. Знание всего абсолютно не обязательно, но небольшое чтение + проб и ошибок помогло бы. ; -)