Должны ли границы появления XSD быть в последовательности или элементе? - PullRequest
12 голосов
/ 12 февраля 2009

Если у меня есть элемент с одним или несколькими подэлементами, должны ли атрибуты 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>

Ответы [ 3 ]

19 голосов
/ 12 февраля 2009

Почти во всех обстоятельствах вы хотите поместить минимальное / максимальное количество событий в элемент в последовательности, а не в последовательность. Используя ваш пример:

<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 с подряд или один sequence с двумя book элементами? Это не соответствует требованию Уникальная атрибуция частиц .

Наконец, если вы добавите 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>

тогда ясно и недвусмысленно, что вы намереваетесь: последовательность из одного или нескольких book элементов, за которой следует последовательность из одного или нескольких ebook элементов.

2 голосов
/ 12 февраля 2009

должно быть на <xsd:element>, имхо.

Эффект помещения его в последовательность в конечном итоге остается тем же (для этого случая). Но, глядя на это с логической точки зрения, вы хотите выразить, что это последовательность элементов , а не строка последовательностей, содержащая по одному элементу каждый .

Надеть его на оба было бы определенно неправильно для меня, хотя для этого случая (опять же) не будет никакой практической разницы.

1 голос
/ 12 февраля 2009

Поместите атрибут maxOccurs в элемент .

<xsd:sequence>
  <xsd:element ref="book" minOccurs="1" maxOccurs="unbounded"/> <!-- here! -->
</xsd:sequence>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...