【问题标题】:XSD: How to use an element of a type derived from an abstract type correctly?XSD:如何正确使用从抽象类型派生的类型的元素?
【发布时间】:2018-10-18 09:24:58
【问题描述】:

我有以下架构,其中包含抽象列表类型的定义和具体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

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

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

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

    List 的内容模型是BaseList 的扩展,因此只能添加 元素,不能修改现有元素。此外,同名但不同类型的元素不能共享父元素

    另请参阅:

    【讨论】:

    • 谢谢。我尝试使用更新版本的 xmllint,现在它表明架构中有错误。我想没有简单的方法可以为此获取有效的架构?
    • 很明显,如果您重做(或完全放弃)其继承结构,您可以编写一个 XSD 来验证 XML。
    • 当然,但我的架构的重点是获取基本列表和内容类型,然后可以轻松创建一堆具有不同内容的具体列表类型。哦,好吧......那么回到绘图板。
    • 我添加了几个链接,在您探索替代方案时可能会有所帮助。
    • 再次感谢。在这种情况下,小组看起来对我有帮助。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2011-01-11
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2018-11-19
    • 2013-06-30
    相关资源
    最近更新 更多