Цели:
Создайте XSD, где атрибут «тип» требуется для каждого элемента xs:, определенного в схеме.
Иметь возможность повторно использовать переопределенный
http://www.w3.org/2001/XMLSchema
в других схемах, чтобы заставить все определенные xs:element(s) требовать атрибут "type"
Например, я хотел бы, чтобы следующее было «недопустимым» в нашем XSD (например, в XMLSpy)
<xs:element name="SomeElement"/>
тогда как следующее будет действительным
<xs:element name="SomeElement" type="abc:SomeType"/>
Вот пример схемы, в которой я попытался переопределить <xs:complexType name="element">
, чтобы требовать атрибут "тип".
<?xml version="1.0"?>
<!-- edited with XMLSpy v2013 (http://www.altova.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:redefine schemaLocation="http://www.w3.org/2001/XMLSchema.xsd">
<xs:complexType name="element" abstract="true">
<xs:complexContent>
<xs:restriction base="xs:element">
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:QName"/>
</xs:simpleType>
</xs:attribute>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="topLevelElement">
<xs:complexContent>
<xs:restriction base="xs:topLevelElement"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="localElement">
<xs:complexContent>
<xs:restriction base="xs:localElement"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="narrowMaxMin">
<xs:complexContent>
<xs:restriction base="xs:narrowMaxMin"/>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
<xs:element name="SomeElement"/>
</xs:schema>
Теперь есть некоторые интересные аспекты этой схемы и некоторое странное поведение в XMLSpy 2013 (без пакета обновления):
В представлении «Текст» при попытке сохранения XMLSpy указывает, что схема «недействительна».
В представлении «Схема» при попытке сохранения XMLSpy указывает, что схема действительна.
Попытка создать образец XML-файла в XMLSpy приведет к ошибке, указывающей, что схема недействительна.
Единственная часть схемы, которая не должна быть допустимой, — это
<xs:element name="SomeElement">
, поскольку она не была определена с помощью атрибута «тип».Возникающие ошибки связаны с дублированием объявлений; но то, что предпринимается, является переопределением, а не другим объявлением.
Вопросы:
- Можно ли переопределить
<xs:complexType name="element">
, чтобы требовать атрибут «тип»? - Можно ли использовать этот переопределенный тип в других XSD с другим «targetNamespace»?