我正在尝试为可以有多种格式的类型进行架构定义,但我不太确定如何最好地做到这一点。
我尝试为其创建类型的 XML 块将涵盖如下条目:
<Object>
<Filter> <!-- 0 or 1 of these -->
<!-- Filter stuff -->
</Filter>
<MapObject> <!-- 1 or more of these
<!-- Map Object stuff -->
</MapObject>
</Object>
OR
<Object>
<Filter> <!-- 0 or 1 of these -->
<!-- Filter stuff -->
</Filter>
<UpdateObject> <!-- 1 or more of these
<!-- Update Object stuff -->
</UpdateObject>
</Object>
我可以选择 xs:sequence,例如:
<xs:complexType name="ObjectType">
<xs:sequence>
<xs:element name="Filter" minOccurs="0" maxOccurs="unbounded" type="FilterType"/>
<xs:element name="MapObject" minOccurs="0" maxOccurs="unbounded" type="MapObjectType"/>
<xs:element name="UpdateObject" minOccurs="0" maxOccurs="unbounded" type="UpdateObjectType"/>
</xs:sequence>
</xs:complexType>
但是我想确保我至少有 1 个 MapObject 或 UpdateObject,并且我可以允许多个 MapObject(但只能有 1 个 UpdateObject),并且我们不能混合使用 MapObject 和 UpdateObject。
有人对如何在模式定义中最好地定义它有建议吗?
如果您可以使用XSD 1.1,则可以使用
assert
逻辑运算符:
它看起来像下面这样:
<xs:complexType name="ObjectType">
<xs:sequence>
<!-- Filter 0 or 1 of these -->
<xs:element name="Filter" minOccurs="0" maxOccurs="1" type="FilterType"/>
<!-- MapObject : undefined if UpdateObject or 1 min (no max) -->
<xs:element name="MapObject" minOccurs="0" maxOccurs="unbounded" type="MapObjectType"/>
<!-- UpdateObject : undefined if MapObject or 1 max -->
<xs:element name="UpdateObject" minOccurs="0" maxOccurs="1" type="UpdateObjectType"/>
<xs:assert test="(MapObject and !UpdateObject) or (!MapObject and UpdateObject)"/>
</xs:sequence>
</xs:complexType>
请参阅文档此处
如果 XSD 1.1 没有问题,您可以在后端服务器中进行这种逻辑检查(这就是我在了解
xs:assert
运算符之前所做的事情)。
类似问题这里