XSD中的无序元素具有强制性和无界元素?

时间:2016-06-22 13:41:12

标签: xml xsd

我的XSD中有以下元素:

<xs:element name="documents" minOccurs="1" maxOccurs="1">
    <xs:complexType>
        <xs:sequence>

            <xs:element name="invoice" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>

            <xs:element name="report" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>

            <xs:element name="additional" minOccurs="0" maxOccurs="unbounded">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>

        </xs:sequence>
    </xs:complexType>
</xs:element>

您可以看到文档必须始终包含发票,并且可以选择包含单个报表和零个或多个附加内容。

问题是这些元素可能具有不同的外观顺序,因此我不再使用sequence。我尝试使用all但问题是附加元素,因为它有maxOccurs="unbounded"

如何拥有一个无序的元素列表,其中一个元素总是需要,另一个元素有无限次出现?

1 个答案:

答案 0 :(得分:3)

三点建议。之一:

  1. 订购。几乎总是认为需要允许任何 在实践中不需要订购元素。
  2. 使用XSD 1.1,maxOccurs="unbounded"支持xsd:all
  3. 在您希望允许的元素周围使用包装 maxOccurs="unbounded"。有关工作示例,请参阅下面XSD中的additionalList
  4. XSD与包装元素解决无界xsd:所有限制

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
               elementFormDefault="qualified">
      <xs:element name="documents">
        <xs:complexType>
          <xs:all>
            <xs:element name="invoice" minOccurs="1" maxOccurs="1">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:minLength value="1"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
            <xs:element name="report" minOccurs="0" maxOccurs="1">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:minLength value="1"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
            <xs:element name="additionalList" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="additional" minOccurs="0" maxOccurs="unbounded">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:schema>