XSD出现边界应该在序列还是元素上?

sk.*_*sk. 12 xml xsd

如果我有一个带有一个或多个子元素的元素,那么min/maxoccurs属性应该在xsd:sequence元素,xsd:元素,两者还是两者上?

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence minOccurs="1" maxOccurs="unbounded"> <!-- here? -->
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/> <!-- or here? -->
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

Edd*_*die 19

在几乎所有情况下,您都希望将min/max Occurs放在序列中的元素上而不是序列上.使用你的例子:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

这是毫不含糊的.如果连续存在一系列书籍元素,则可以指向哪个架构项正在生成它们.然而:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence minOccurs="1" maxOccurs="unbounded"/>
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

在这里,如果你book连续有两个" "元素,你sequence是连续sequence两个,还是一个有两个book元素?这未达到Unique Particle Attribution要求.

最后,如果您将序列中的最小/最大值发生,并稍后添加其他元素:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence minOccurs="1" maxOccurs="unbounded"/>
      <xsd:element ref="book"/>
      <xsd:element ref="ebook"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

那么这可能允许以下XML,这可能不是你想要的:

<books>
  <book/><ebook/><book/><ebook/><book/><ebook/><book/><ebook/>
</books>
Run Code Online (Sandbox Code Playgroud)

而如果你有:

<xsd:element name="books">
  <xsd:complexType>
    <xsd:sequence/>
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/>
      <xsd:element ref="ebook" minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

那么你想要的是清楚明确的:一个或多个book元素的序列,后跟一个或多个元素的序列ebook.