Xml XSD1.0:如何按任意顺序验证4个元素,每个元素只出现一次,但其中至少一个元素必须只出现一次
我的设想如下:Xml XSD1.0:如何按任意顺序验证4个元素,每个元素只出现一次,但其中至少一个元素必须只出现一次,xml,xsd,schema,xsd-validation,Xml,Xsd,Schema,Xsd Validation,我的设想如下: 我有4个不同的元素,可以出现在任何顺序 这4个元素中的每个元素最多只能出现一次。也就是说,0或1次 必须至少出现这4个元素中的一个 遗憾的是,我不得不使用.NETFramework类来处理模式,这意味着我正在寻找使用XSD1.0的解决方案 下面是一些显然不起作用的XML示例 <xs:complexType name="Groups"> <xs:sequence> <xs:element name="Group1" type="group1" mi
<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: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个元素出现在它之后的任何元素组合中,那么它将成为一个非常复杂的大型模式,具有大量的选择和序列节点,并在不同的位置将minOccurs设置为0。下面的模式将验证以Group1开始的任何文件以及其他组的任何组合
<?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>
您需要将
替换为
,这将
<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个元素出现在它之后的任何元素组合中,那么它将成为一个非常复杂的大型模式,具有大量的选择和序列节点,并在不同的位置将minOccurs设置为0。下面的模式将验证以Group1开始的任何文件以及其他组的任何组合
<?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>