XSD: 如何正确使用抽象类型派生类型的元素?
XSD: How to use an element of a type derived from an abstract type correctly?
我有以下架构,其中包含抽象列表类型的定义和具体 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
您的 XSD 本身甚至在验证您的 XML 文档之前就存在问题:
[Error] test.xsd:23:31: cos-element-consistent: Error for type List
.
Multiple elements with name content
, with different types, appear in
the model group.
List
的内容模型是 BaseList
的扩展,因此只能 添加 元素,不修改现有元素。此外,同名但类型不同的元素不能共享父元素:
另请参阅:
我有以下架构,其中包含抽象列表类型的定义和具体 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
您的 XSD 本身甚至在验证您的 XML 文档之前就存在问题:
[Error] test.xsd:23:31: cos-element-consistent: Error for type
List
. Multiple elements with namecontent
, with different types, appear in the model group.
List
的内容模型是 BaseList
的扩展,因此只能 添加 元素,不修改现有元素。此外,同名但类型不同的元素不能共享父元素:
另请参阅: