XSD: Как правильно использовать элемент типа, производного от абстрактного типа? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующая схема, содержащая определение типа абстрактного списка и определение конкретного типа List.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="BaseListContent" abstract="true" />

  <xs:complexType name="BaseList" abstract="true">
    <xs:sequence>
      <xs:element name="id" type="xs:int" />
      <xs:element name="content" type="BaseListContent" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ListContent">
    <xs:complexContent>
      <xs:extension base="BaseListContent">
        <xs:sequence>
          <xs:element name="id" type="xs:int" minOccurs="0" maxOccurs="10" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="List">
    <xs:complexContent>
      <xs:extension base="BaseList">
        <xs:sequence>
          <xs:element name="content" type="ListContent" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="list" type="List" />

</xs:schema>

Теперь я пытаюсь проверить следующий XML-документ на соответствие схеме:

<list>
  <id>1</id>
  <content>
    <id>1</id>
    <id>2</id>
  </content>
</list>

Но xmllint говорит мне, что документ недействителен:

> xmllint --noout --schema ~/test.xsd ~/test.xml
test.xml:1: element list: Schemas validity error : Element 'list': Missing child element(s). Expected is ( content ).
test.xml fails to validate

В чем здесь проблема, поскольку явно есть дочерний элемент content?

Обновление: более поздняя версия xmllint (с использованием libxml версии 20904) показывает мне ошибку в схеме.

$ xmllint --noout --schema test.xsd test.xml
test.xml:3: element content: Schemas validity error : Element 'content': The type definition is abstract.
test.xml:1: element list: Schemas validity error : Element 'list': Missing child element(s). Expected is ( content ).
test.xml fails to validate

1 Ответ

0 голосов
/ 18 октября 2018

У вашего XSD есть проблема даже до проверки вашего XML-документа:

[Ошибка] test.xsd: 23: 31: согласовано с cos-element: ошибка для типа List,Несколько элементов с именем content, с разными типами, появляются в группе моделей.

Модель содержимого для List является расширением BaseList и может быть только добавить элементов, а не изменять существующие элементы.Кроме того, элементы с одинаковыми именами, но с разными типами не могут совместно использовать родительский элемент :

См. Также:

...