XSD:如何正确使用从抽象类型派生的类型的元素?

时间:2018-10-18 09:24:58

标签: xml xsd xsd-validation xml-validation

我有以下模式,其中包含抽象列表类型的定义和具体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 :(得分:1)

您的XSD本身甚至在验证XML文档之前就有问题:

  

[错误] test.xsd:23:31:cos-element-consistent:类型List的错误。   名称不同的类型为content的多个元素出现在   模型组。

List的内容模型是BaseList的扩展,因此只能 add 个元素,而不能修改现有元素。另外, 名称相同但类型不同的元素不能共享父对象

另请参见: