繁体   English   中英

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM