xsd:all 之后的重复元素

Repetitive element after xsd:all

我有 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 的任何顺序,后跟任何note 个元素的数量。

您将无法跟随具有多个类似元素的 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>

以不同顺序排列元素的灵活性在实践中往往没有那么有用,并且随着架构的发展会产生诸如此类的限制性问题。

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>
    
  • 对于不是特别漂亮或干净的设计,不需要漂亮或干净的内容模型。拥抱丑陋。磨出name, surname, birthday, placeofbirth的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) 针对该表单的架构进行验证。 (如果现有的格式是上级强加的,当然,他们可能会认为这种做法是对格式的批评;你需要决定是否冒这个险。)