Как указать в схеме XML, что должно присутствовать одно из двух полей? - PullRequest
12 голосов
/ 26 марта 2010

Я хочу указать, что либо fieldname, либо freetext всегда должны присутствовать в файлах XML, которые применяются к этому XSD. Есть ли способ сделать это?

<xs:complexType name="tSome">
<xs:sequence>
  <!-- either one of the two below has to be present. -->
  <xs:element name="fieldname" type="xs:string" />
  <xs:element name="freetext" type="xs:string" />
  <!-- this one below must always be present -->
  <xs:element name="dbtablename" type="xs:string" />
</xs:sequence>
</xs:complexType>

Ответы [ 2 ]

23 голосов
/ 26 марта 2010

В схеме XML есть Choice Indicator , который позволяет вам взять один из содержащихся элементов, но не два или более. Если вы хотите 2 из 3, я предлагаю сделать что-то вроде этого:

<xs:choice>
  <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:choice>
<xs:choice>
  <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" />
  <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:choice>

(возможно, maxOccurs не позволит вам выбрать один и тот же элемент дважды.) Если это не сработает, я ничего не подумаю.

Отредактировано : Я не правильно понял вопрос в первый раз. Если вы хотите, чтобы dbtablename всегда присутствовал с любым из fieldname или freetext, то это ответ:

<xs:complexType name="tSome">
<xs:sequence>
  <xs:choice>
    <xs:element name="fieldname" type="xs:string" />
    <xs:element name="freetext" type="xs:string" />
  </xs:choice>
  <xs:element name="dbtablename" type="xs:string" />
</xs:sequence>
</xs:complexType>
4 голосов
/ 26 марта 2010

Итак, вы хотите либо fieldname, либо freetext, а не оба? или может и то и другое? а потом dbtablename опционально?

Вот 1 или 2 элемента:

<xs:choice minOccurs="1" maxOccurs="2">
    <xs:element name="fieldname" type="xs:string"/>
    <xs:element name="freetext" type="xs:string"/>
    <xs:element name="dbtablename" type="xs:string"/>
</xs:choice>

Это то, что вы хотите? или вы хотели, чтобы dbtablename был отдельным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...