XML 验证:XSD 中的并发无序和出现要求

XML validation: Concurrent unordered and occurrence requirements in XSD

在XML Schema (XSD 1.0)中,我对四个元素有以下要求:

  1. element1 总是最先出现,minOccurs = 0 且 maxOccurs = 1
  2. element2 将出现 minOccurs = 0 和 maxOccurs = 1
  3. element3 将出现 minOccurs = 0 和 maxOccurs = unbounded
  4. element2element3 将以任意顺序出现(在 element1 之后和 element4 之前)
  5. element4 将始终出现在最后,minOccurs = 0 且 maxOccurs = unbounded
  6. 所有这些元素都是 parent_element 的子元素,并且它们的 minOccurs = 0,但至少其中 1 个应该出现在父元素。

我创建了一个满足所有要求的方案,除了 #2#6。在我的模式中,element2 和 element3 可以以任何顺序出现,但我无法限制 element2 只出现一次。此外,我无法确保 parent_element 中至少存在 1 个元素。

查看下面的架构并提出更新建议以满足上述所有要求。

<xs:element name="parent_element">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="element1" type="type1" minOccurs="0" maxOccurs="1" />
            <xs:choice minOccurs="0" maxOccurs="unbounded" >
                <xs:element name="element2" type="type1" />
                <xs:element name="element3" type="type1" />
            </xs:choice>
            <xs:element name="element4" type="type2" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

为了满足要求#2,我尝试了将 maxOccurs="1" 与 element2(内部选择)一起使用的技巧,但它不起作用,并且 element2 仍然能够以任何顺序与 element3 重复多次.

<xs:element name="parent_element">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="element1" type="type1" minOccurs="0" maxOccurs="1" />
            <xs:choice minOccurs="0" maxOccurs="unbounded" >
                <xs:element name="element2" type="type1" maxOccurs="1" />
                <xs:element name="element3" type="type1" />
            </xs:choice>
            <xs:element name="element4" type="type2" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

要求 #4 和 #6 禁止使用 XSD 1.0。

XSD 1.1 可以通过 xs:assert:

满足这些要求

XSD 1.1 解决方案

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified"
           vc:minVersion="1.1">
    <xs:element name="parent_element">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="element1" minOccurs="0" maxOccurs="1" />
          <xs:choice minOccurs="0" maxOccurs="unbounded" >
            <xs:element name="element2" />
            <xs:element name="element3" />
          </xs:choice>
          <xs:element name="element4" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:assert test="count(element2) &lt; 2 
                          and (element1 or element2 or element3 or element4)"/>
      </xs:complexType>
    </xs:element>
</xs:schema>