Проблема проверки XSD с элементами choice и extension - PullRequest
3 голосов
/ 12 марта 2010

Я опубликую два примера, один, который проверяет, а другой - нет. Мне интересно узнать, почему второй не работает, так как они очень похожи.

Пример 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

1 Ответ

1 голос
/ 12 марта 2010

В xml для вашего неправильного регистра вы пропускаете обязательный элемент "z".

<root xsi:noNamespaceSchemaLocation="incorrect.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
   <x>1</x>
   <y>1</y>
   <z>1</z>
</root>

Проверяется на Валидатор DecisionsSoft и Валидатор xmlme

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...