带有无序必需,可选和任意标记的XSD架构

时间:2015-07-28 13:07:24

标签: xml xsd schema xsd-1.0

我正在尝试使用以下约束来构建XSD 1.0架构:

  1. 没有订购
  2. 某些元素必须恰好出现一次
  3. 某些元素可能显示为零或无限时间
  4. 允许无法识别的元素(不验证它们)
  5. 3.的原因是,如果元素存在,我想验证类型。

    例如,一个人必须只有一个名字,一个可选年龄(最多一个),可选的电话号码(无限制)和任何其他标签。这些应验证:

    <person>
      <name>Bob</name>
      <age>33</age>
      <phone>123456789</phone>
      <phone>123456788</phone>
    </person>
    
    <person>
      <name>Alice</name>
    </person>
    
    <person>
      <name>John</name>
      <!-- unrecognized, arbitrary tags: -->
      <location>city</location>
      <occupation>laywer</occupation>
    </person>
    

    然而,这些验证:

    <person>
      <!-- I am missing a name -->
      <phone>123456789</phone>
    </person>
    
    <person>
      <!-- I should only have one name -->
      <name>Sally</name>
      <name>Mary</name>
    </person>
    
    <person>
      <name>Josh</name>
      <!-- Phone number is not an int -->
      <phone>not a number</phone>
    </person>
    

    这是无效的XSD,它以人类可理解的方式捕获我正在尝试做的事情:

    <xs:element name="person">
      <xs:complexType>
        <xs:all>
          <xs:element type="xs:string" name="name" minOccurs="1" maxOccurs="1"/>
          <xs:element type="xs:int" name="age" minOccurs="0" maxOccurs="1"/>
          <xs:element type="xs:int" name="phone" minOccurs="0" maxOccurs="unbounded"/>
          <xs:any />
        </xs:all>
      </xs:complexType>
    </xs:element>
    

    此XSD无效,因为您在<any>下无法<all>,并且XSD 1.0不允许您在maxOccurs="unbounded"元素中拥有<all>。有人知道如何实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

您可以在XSD 1.1中使用xs:all执行您要查找的内容。

在XSD 1.0中无法实现。