XSD 1.0:如何按任何顺序验证4个元素,每个元素仅出现一次,但是至少一个元素必须仅发生一次



我的场景如下:

  1. 我有4个不同的元素,可以以任何顺序出现
  2. 这4个元素中的每个元素中的每一个最多只能出现一次。也就是说,0或1次。
  3. 至少必须发生这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. 允许组#节点的任何订单
  2. 允许每个元素最大发生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>

最新更新