Я опубликую два примера, один, который проверяет, а другой - нет. Мне интересно узнать, почему второй не работает, так как они очень похожи.
Пример 1 (проверяет)
XSD:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<xsd:element name="root" type="BBB"/>
<xsd:complexType name="AAA">
<xsd:choice maxOccurs="2">
<xsd:element name="x" type="xsd:string"/>
<xsd:element name="y" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="BBB">
<xsd:complexContent>
<xsd:extension base="AAA"/>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
XML:
<root xsi:noNamespaceSchemaLocation="incorrect.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<x>1</x>
<y>1</y>
</root>
Пример 2 (не проверяется)
XSD:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<xsd:element name="root" type="BBB"/>
<xsd:complexType name="AAA">
<xsd:choice maxOccurs="2">
<xsd:element name="x" type="xsd:string"/>
<xsd:element name="y" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="BBB">
<xsd:complexContent>
<xsd:extension base="AAA">
<xsd:choice>
<xsd:element name="z" type="xsd:string"/>
</xsd:choice>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
xml: (аналогично примеру 1)
<root xsi:noNamespaceSchemaLocation="incorrect.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<x>1</x>
<y>1</y>
</root>
Чтобы сэкономить время на выполнение сравнения с xsd, единственное отличие состоит в том, что во втором примере сложный тип BBB имеет <choice>
xmllint говорит следующее о Примере 2:
$ xmllint --noout --schema example2.xsd example2.xml
example2.xml: 3: элемент y: ошибка достоверности схемы: элемент 'y': этот элемент не ожидается. Ожидается (z).
example2.xml не может проверить
Примеры на основе http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_ext_patterns_st1.html