Наиболее эффективная схема для этого или того, или этого и того - PullRequest
4 голосов
/ 14 января 2010

Я пытаюсь написать схему XML, которая позволяет выражать XML следующими способами:

домашние животные могут содержать элементы как кошки, так и собаки:

<root>
  <pets>
    <cat />
    <dog />
  </pets>
</root>

домашние животные могут содержать только элементы кошки или собаки

<root>
  <pets>
    <cat />
  </pets>
</root>
-----------
<root>
  <pets>
    <dog />
  </pets>
</root>

если питомцы не имеют подэлементов, то они должны отсутствовать:

<root>
</root>

Лучшая схема, которую я придумал для удовлетворения этих условий, такова:

<xs:element name="pets">
  <xs:complexType>
    <xs:choice>
      <xs:sequence>
        <xs:element name="cat"/>
        <xs:element name="dog" minOccurs="0"/>
      </xs:sequence>
      <xs:sequence>
        <xs:element name="dog"/>
      </xs:sequence>
    </xs:choice>
  </xs:complexType>
</xs:element>

Это всегда казалось мне слишком большой схемой для такой простой концепции. Есть ли более простой способ написать эту схему? Спасибо!

Ответы [ 2 ]

3 голосов
/ 16 января 2010

Я думаю, что это идеальная ситуация для использования элемента xs: group: если вы оберните его вокруг своего элемента и сделаете его необязательным (при этом содержимое этого элемента обязательно), вы получите желаемый эффект.

<xs:group name="pets_group">
  <xs:element name="pets" minOccurs="0" maxOccurs="1">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="cat"/>
          <xs:element name="dog" minOccurs="0"/>
        </xs:sequence>
        <xs:sequence>
          <xs:element name="dog"/>
          <xs:element name="cat" minOccurs="0"/>
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:group>

Тогда вместо использования элемента pets используйте группу pets_group:

<xs:element name="root">
  <xs:complexType>
    <xs:group ref="pets_group"/>
  </xs:complexType>
</xs:element>

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

В качестве альтернативы, вы можете определить их вместе, просто "вставив" ссылку на группу. Это, вероятно, то, что вы хотите сделать, если тег домашних животных используется только в одном месте.

2 голосов
/ 19 января 2010

Решение, которое вы предлагаете в своем вопросе, является наиболее распространенным решением. Помимо идеи группы в другом ответе, лучшего способа нет. Лично я предпочитаю ваше решение.

Большие стандартные схемы (например, FpML ) используют ваш шаблон.

...