1

在 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

1 回答 1

1

要求 #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>
于 2015-09-18T11:55:00.613 回答