我的场景如下:
- 我有4个不同的元素,可以以任何顺序出现
- 这4个元素中的每个元素中的每一个最多只能出现一次。也就是说,0或1次。
- 至少必须发生这4个元素中的一个。
可悲的是,我被禁止使用.NET框架类处理模式,这意味着我正在寻找使用XSD 1.0的解决方案。
这是一些示例XML,显然不起作用!
<xs:complexType name="Groups">
<xs:sequence>
<xs:element name="Group1" type="group1" minOccurs="0" maxOccurs="1" />
<xs:element name="Group2" type="group2" minOccurs="0" maxOccurs="1" />
<xs:element name="Group3" type="group3" minOccurs="0" maxOccurs="1" />
<xs:element name="Group4" type="group4" minOccurs="0" maxOccurs="1" />
</xs:sequence></xs:complexType>
您需要用<xs:all>
替换<xs:sequence>
,这将
- 允许组#节点的任何订单
- 允许每个元素最大发生1
以下未验证的唯一一件事是至少有1个元素发生。
<xs:element name="Groups">
<xs:complexType>
<xs:all>
<xs:element minOccurs="0" maxOccurs="1" name="Group1" type="Group1" />
<xs:element minOccurs="0" maxOccurs="1" name="Group2" type="Group2" />
<xs:element minOccurs="0" maxOccurs="1" name="Group3" type="Group3" />
<xs:element minOccurs="0" maxOccurs="1" name="Group4" type="Group4" />
</xs:all>
</xs:complexType>
</xs:element>
如果您真的想验证至少有1个元素在其之后的任何组合中发生,它将变成一个非常复杂的大型模式,具有很多选择和序列节点,并将米诺胶将在各个地方设置为0。以下模式将验证以组1和其他组组合开头的任何文件。
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch.SO57321841" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://Scratch.SO57321841" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Groups">
<xs:complexType>
<xs:choice minOccurs="1">
<xs:sequence>
<xs:element name="Group1" type="Group1" />
<xs:choice minOccurs="0">
<xs:sequence>
<xs:element name="Group2" type="Group2" />
<xs:choice minOccurs="0">
<xs:sequence>
<xs:element name="Group3" type="Group3" />
<xs:element minOccurs="0" name="Group4" type="Group4" />
</xs:sequence>
<xs:sequence>
<xs:element name="Group4" type="Group4" />
<xs:element minOccurs="0" name="Group3" type="Group3" />
</xs:sequence>
</xs:choice>
</xs:sequence>
<xs:sequence>
<xs:element name="Group3" type="Group3" />
<xs:choice minOccurs="0">
<xs:sequence>
<xs:element name="Group2" type="Group2" />
<xs:element minOccurs="0" name="Group4" type="Group4" />
</xs:sequence>
<xs:sequence>
<xs:element name="Group4" type="Group4" />
<xs:element minOccurs="0" name="Group2" type="Group2" />
</xs:sequence>
</xs:choice>
</xs:sequence>
<xs:sequence>
<xs:element name="Group4" type="Group4" />
<xs:choice minOccurs="0">
<xs:sequence>
<xs:element name="Group2" type="Group2" />
<xs:element minOccurs="0" name="Group3" type="Group3" />
</xs:sequence>
<xs:sequence>
<xs:element name="Group3" type="Group3" />
<xs:element minOccurs="0" name="Group2" type="Group2" />
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:choice>
</xs:sequence>
<xs:sequence>
<xs:element name="Group2" type="Group2" />
<xs:choice minOccurs="0" />
</xs:sequence>
<xs:sequence>
<xs:element name="Group3" type="Group3" />
<xs:choice minOccurs="0" />
</xs:sequence>
<xs:sequence>
<xs:element name="Group4" type="Group4" />
<xs:choice minOccurs="0" />
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Group1" />
<xs:complexType name="Group2" />
<xs:complexType name="Group3" />
<xs:complexType name="Group4" />
</xs:schema>