Чтобы получить тип и исправить значение, используйте ограничение :
<xs:complexType name="signal" >
<xs:complexContent>
<xs:restriction base="aos:event">
<xs:attribute name="type" type="aos:event_type" fixed="signal" use="required" />
<xs:attribute name="source" type="aos:signal_source" use="required" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
Из прочтения спецификации я бы ожидал, что вы не сможете добавить атрибутыв ограничении , если только базовый тип не имеет подстановочного знака атрибута , но валидатор W3C XSD принимает вышеуказанное.Если вы столкнетесь с проблемами, вы можете разбить определение на ограничение и расширение:
<xs:complexType name="fixedSignalEvent">
<xs:complexContent>
<xs:restriction base="aos:event">
<xs:attribute name="type" type="aos:event_type" fixed="signal" use="required" />
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="signal" >
<xs:complexContent>
<xs:extension base="aos:fixedSignalEvent">
<xs:attribute name="source" type="aos:signal_source" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
Другим исправлением будет добавление подстановочного знака атрибута к базовому типу.
<xs:complexType name="event" abstract="true" >
<xs:attribute name="move" type="aos:move_ref" use="required" />
<xs:attribute name="type" type="aos:event_type" use="required" />
<xs:anyAttribute />
</xs:complexType>
Это не эквивалентное решение, так как оно позволяет событию иметь что-либо для атрибута (что может быть нежелательно, вообще говоря, но, возможно, не для генерации кода), и не добавляетдополнительный тип (что желательно).
Обратите внимание, что любые частицы (элементы, группы или символы подстановки) в базе должны повторяться в ограничении , иначе они не будут разрешены вэлемент.Если для базы требуется ограниченный атрибут, он также должен быть указан в ограничении.Существует множество других свойств, которым должно соответствовать ограничение, чтобы быть действительным производным или частицей .Спецификация не очень удобочитаема, но вы можете наткнуться на нее.
См. Также: " как использовать ограничения и расширения в XSD одновременно ".