我正在尝试使用XML Schema中的限制进行某种形式的合成。
我有一个complexType
,可以在其他几个complexTypes
中重复使用。我想指定在FieldA
中包含PartialType
时FullTypeA
必须是一个值,FullTypeB
中包含<xs:complexType name="PartialType">
<xs:sequence>
<xs:element name="FieldA" type="xs:unsignedShort" />
<xs:element name="FieldB" type="xs:unsignedShort" />
</xs:sequence>
</xs:complexType>
<!-- FieldA must be 1 for FullTypeA-->
<xs:complexType name="FullTypeA">
<xs:sequence>
<xs:element ref="PartialType" />
<xs:element name="FieldC" type="xs:unsignedShort" />
</xs:sequence>
</xs:complexType>
<!-- FieldA must be 2 for FullTypeB-->
<xs:complexType name="FullTypeB">
<xs:sequence>
<xs:element ref="PartialType" />
<xs:element name="FieldD" type="xs:unsignedShort" />
</xs:sequence>
</xs:complexType>
时的值{}。
{{1}}
我应该如何构建我的XML Schema以适应这种情况?
答案 0 :(得分:1)
我认为Xsd并不是真的允许这样做。
实现此目标的一种可能方法是使用xs:restriction
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="PartialType">
<xs:sequence>
<xs:element name="FieldA" type="xs:unsignedShort" />
<xs:element name="FieldB" type="xs:unsignedShort" />
<xs:choice>
<xs:element name="FieldC" type="xs:unsignedShort" />
<xs:element name="FieldD" type="xs:unsignedShort" />
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="FullTypeA">
<xs:complexContent>
<xs:restriction base="PartialType">
<xs:sequence>
<xs:element name="FieldA" type="xs:unsignedShort" fixed="1" />
<xs:element name="FieldB" type="xs:unsignedShort" />
<xs:element name="FieldC" type="xs:unsignedShort" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="FullTypeB">
<xs:complexContent>
<xs:restriction base="PartialType">
<xs:sequence>
<xs:element name="FieldA" type="xs:unsignedShort" fixed="2" />
<xs:element name="FieldB" type="xs:unsignedShort" />
<xs:element name="FieldD" type="xs:unsignedShort" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
这方面的缺点很明显:您必须在 PartialType 中声明所有元素。
另一种方法是使用xs:extension
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="PartialType">
<xs:sequence>
<xs:element name="FieldB" type="xs:unsignedShort" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="FullTypeA">
<xs:complexContent>
<xs:extension base="PartialType">
<xs:sequence>
<xs:element name="FieldA" type="xs:unsignedShort" fixed="1" />
<xs:element name="FieldB" type="xs:unsignedShort" />
<xs:element name="FieldC" type="xs:unsignedShort" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="FullTypeB">
<xs:complexContent>
<xs:extension base="PartialType">
<xs:sequence>
<xs:element name="FieldA" type="xs:unsignedShort" fixed="2" />
<xs:element name="FieldB" type="xs:unsignedShort" />
<xs:element name="FieldD" type="xs:unsignedShort" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>