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

我的设想如下:

  • 我有4个不同的元素,可以出现在任何顺序
  • 这4个元素中的每个元素最多只能出现一次。也就是说,0或1次
  • 必须至少出现这4个元素中的一个
  • 遗憾的是,我不得不使用.NETFramework类来处理模式,这意味着我正在寻找使用XSD1.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>
    

    您需要将
    替换为
    ,这将

  • 允许组#节点的任何顺序
  • 允许每个元素的最大值为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个元素出现在它之后的任何元素组合中,那么它将成为一个非常复杂的大型模式,具有大量的选择和序列节点,并在不同的位置将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>
    

    您需要将
    替换为
    ,这将

  • 允许组#节点的任何顺序
  • 允许每个元素的最大值为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个元素出现在它之后的任何元素组合中,那么它将成为一个非常复杂的大型模式,具有大量的选择和序列节点,并在不同的位置将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>