代码之家  ›  专栏  ›  技术社区  ›  sk.

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

  •  12
  • sk.  · 技术社区  · 16 年前

    如果我有一个包含一个或多个子元素的元素,那么min/maxclosses属性应该在xsd:sequence元素、xsd:element上,还是两者都有,或者两者都没有?

    <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>
    
    3 回复  |  直到 16 年前
        1
  •  19
  •   Eddie    16 年前

    在几乎所有情况下,您都希望将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>
    

    这是毋庸置疑的。如果一行中有一系列书籍元素,您可以精确地指向哪个模式项正在生成它们。然而:

    <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>
    

    在这里,如果你有两个” book “一排元素,你有两个吗 sequence s排成一排,或者一个 Unique Particle Attribution 要求。

    最后,如果将min/max Occurs放在序列上,然后添加一个额外的元素:

    <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>
    

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

    <books>
      <book/><ebook/><book/><ebook/><book/><ebook/><book/><ebook/>
    </books>
    

    而如果你有:

    <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>
    

    那么,你的意图是明确无误的:一个或多个序列 ebook 元素。

        2
  •  2
  •   Tomalak    16 年前

    <xsd:element> 依我拙见

    最终(在这种情况下),将其放在序列上的效果是相同的。但从逻辑的角度来看,你想表达它是一个 元素序列 ,而不是 .

    把它放在两者上对我来说肯定是错误的,尽管在这种情况下,它(再次)不会有任何实际区别。

        3
  •  1
  •   baretta    16 年前

    <xsd:sequence>
      <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/> <!-- here! -->
    </xsd:sequence>