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

时间:2015-09-18 10:19:20

标签: xml xsd xml-validation xsd-1.0

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

  1. element1 将始终首先显示,minOccurs = 0且maxOccurs = 1
  2. 将出现
  3. element2 ,其中minOccurs = 0且maxOccurs = 1
  4. 将出现
  5. element3 ,其中minOccurs = 0且maxOccurs = unbounded
  6. element2 element3 将以任何顺序出现(在element1之后和element4之前)
  7. element4 将始终显示在最后,minOccurs = 0和maxOccurs = unbounded
  8. 所有这些元素都是 parent_element 的子元素,并且所有元素都具有minOccurs = 0,但其中至少有1个元素应存在于父元素中。
  9. 我创建了一个满足除#2 #6 之外的所有要求的方案。在我的架构中,element2和element3可以按任何顺序出现,但我无法限制element2只出现一次。此外,我无法确保 parent_element 中至少存在1个元素。

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

    using(IUserRepository userRepo = new UserRepository())
    {
        IList<MyUser> users = userRepo.GetUsersInOU("someOuPath");
    }
    

    为了满足要求#2,我尝试了使用<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> 和element2(内部选择)的技巧,但它没有用,并且element2仍然可以使用element3以任何顺序重复多次。< / p>

    maxOccurs="1"

1 个答案:

答案 0 :(得分: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>