根据w3schools,group
元素是complexType
元素的子元素。
以下XML Schema文件(XSD)可以互换使用吗?
XSD 没有组元素:
<xs:complexType name="personInfo">
<xs:sequence>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="lastName" type="xs:string"/>
</xs:sequence>
<xs:attribute name="personId" type="xs:string" use="required"/>
</xs:complexType>
<xs:element name="person" type="personInfo"/>
XSD 组元素:
<xs:group name="personGroup">
<xs:sequence>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="lastName" type="xs:string"/>
</xs:sequence>
<xs:attribute name="personId" type="xs:string" use="required"/>
</xs:group>
<xs:complexType name="personInfo">
<xs:group ref="personGroup"/>
</xs:complexType>
<xs:element name="person" type="personInfo"/>
如果是,他们的区别是什么?为什么在group
具有相同效果时使用complexType
元素?
答案 0 :(得分:1)
“ XSD 具有组元素”示例中的内容不正确:
<xs:group name="personGroup">
<xs:sequence>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="lastName" type="xs:string"/>
</xs:sequence>
<!-- Wrong -->
<xs:attribute name="personId" type="xs:string" use="required"/>
</xs:group>
您不能在<xs:group>
的根内部定义属性。您可以有一个包含元素的组,这些元素可以具有自己的属性。这实际上是组和复杂类型之间的差异之一。
组只能包含内容模型或注释(即,其直接子级只能是3:<xs:all />
,<xs:choice />
,<xs:sequence />
或文档元素之一)。请参阅第3.7.2节中的https://www.w3.org/TR/xmlschema11-1/#cModel_Group_Definitions:
<group
id = ID
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
name = NCName
ref = QName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (all | choice | sequence)?)
</group>
复杂类型的行为非常相似,因为它们也可以具有与组完全相同的内容模型,但是它们也可以定义<xs:attributes>
。您甚至可以拥有仅定义属性而无法定义的复杂类型,而组不能做到这一点。