xsd:all之后的重复元素

时间:2015-03-27 00:45:17

标签: xml xsd

我有一些带有某些元素的XML,它们没有严格的顺序,之后我有注释,可以是多个:

<xs:element name="person">
    <xs:complexType>
        <xs:all>
            <xs:element name="name" />
            <xs:element name="surname" />
            <xs:element name="birthday" />
            <xs:element name="placeOfBirth" />
        </xs:all>
        <xs:sequence>
            <xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

是否有替代上面显示的错误xs:complexType

修改:有效我希望name / surname / birthday / placeOfBirth的任意订单后跟任意数量的{{1元素。

2 个答案:

答案 0 :(得分:2)

您无法关注具有此类多个元素的xs:all

如果您愿意让多个note元素出现在排序中的任何位置,并且您愿意将其包装在容器元素中,则可以执行以下操作:

  <xs:element name="person">
    <xs:complexType>
      <xs:all>
        <xs:element name="name" />
        <xs:element name="surname" />
        <xs:element name="birthday" />
        <xs:element name="placeOfBirth" />
        <xs:element name="notes">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:all>
    </xs:complexType>
  </xs:element>

或者,如果您愿意将无序部分包装在一个,例如info元素中,那么这将有效:

  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="info">
          <xs:complexType>
            <xs:all>
              <xs:element name="name" />
              <xs:element name="surname" />
              <xs:element name="birthday" />
              <xs:element name="placeOfBirth" />
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

但是,我真的放弃了无序约束:

  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" />
        <xs:element name="surname" />
        <xs:element name="birthday" />
        <xs:element name="placeOfBirth" />
        <xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

具有不同顺序的元素的灵活性往往在实践中不那么有用,并且可以随着模式的发展而产生诸如此类的限制性问题。

答案 1 :(得分:1)

kjhughes已经对选项进行了很好的调查。另外两个可能值得一提:

  • 在XSD 1.1中,允许note出现在任何地方,而不仅仅是在最后:

    <xsd:all
      <xsd:element ref="name"/>
      <xsd:element ref="surname"/>
      <xsd:element ref="birthday"/>
      <xsd:element ref="placeofbirth"/>
      <xsd:element ref="note" maxOccurs="unbounded"/>
    </xsd:all>
    
  • 对于不是特别漂亮或干净的设计,不需要漂亮或干净的内容模型。拥抱丑陋。研究名称,姓氏,生日和地方出生的24种排列,并编写内容模型以接受它们。

    <xsd:choice><xsd:sequence>
      <xsd:element ref="name"/>
      <xsd:choice><xsd:sequence>
        <xsd:element ref="surname"/>
        <xsd:choice><xsd:sequence>
          <xsd:element ref="birthday"/>
          <xsd:element ref="placeofbirth"/>
          </xsd:sequence><xsd:sequence>
          <xsd:element ref="placeofbirth"/>
          <xsd:element ref="birthday"/>
        </xsd:sequence></xsd:choice>
      </xsd:sequence><xsd:sequence>
        <xsd:element ref="birthday"/>
        <xsd:choice><xsd:sequence>
          <xsd:element ref="surname"/>
          <xsd:element ref="placeofbirth"/>
          </xsd:sequence><xsd:sequence>
          <xsd:element ref="placeofbirth"/>
          <xsd:element ref="surname"/>
        </xsd:sequence></xsd:choice>
      </xsd:sequence><xsd:sequence>
        <xsd:element ref="placeofbirth"/>
        <xsd:choice><xsd:sequence>
          <xsd:element ref="birthday"/>
          <xsd:element ref="surname"/>
          </xsd:sequence><xsd:sequence>
          <xsd:element ref="surname"/>
          <xsd:element ref="birthday"/>
        </xsd:sequence></xsd:choice>
      </xsd:sequence></xsd:choice>
    </xsd:sequence><xsd:sequence>
      <xsd:element ref="surname"/>
      <xsd:choice> ...</xsd:choice>
    </xsd:sequence><xsd:sequence>
      <xsd:element ref="birthday"/>
      <xsd:choice> ...</xsd:choice>
    </xsd:sequence><xsd:sequence>
      <xsd:element ref="placeofbirth"/>
      <xsd:choice> ...</xsd:choice>
    </xsd:sequence></xsd:choice>
    
  • 通过以下方法验证文档:(a)将其转换为更容易验证的相关表格,以及(b)根据该表格的模式进行验证。 (如果现有格式是由上级机构强制执行的,当然,他们可能会认为这种方式是对格式的批评;您需要确定这是否存在危险风险。)