XML-схема - как связать существование одного атрибута с существованием другого атрибута - PullRequest
4 голосов
/ 14 апреля 2010

У меня есть следующие строки xml:

<customer id="3" phone="123456" city="" />  <!--OK-->
<customer id="4" />                         <!--OK--> 
<customer id="3" phone="123456" />          <!--ERROR-->
<customer id="3" city="" />                 <!--ERROR-->

Атрибуты «телефон» и «город» являются необязательными, но если существует «телефон», также должен существовать «город», и наоборот. Можно ли вставить такое ограничение в схему XML?

Спасибо.

1 Ответ

2 голосов
/ 14 апреля 2010

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

Так что, если у вас есть полный контроль над структурой схемы, вы можете сделать что-то вроде этого:

<customer id="1">
  <contact city="Gotham" phone="batman's red phone" />
</customer>

Если элемент contact является необязательным в customer, но city и phone обязательны в contact.

Соответствующий XSD для этой структуры будет выглядеть примерно так:

  <xs:element name="customer">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="contact" minOccurs="0">
          <xs:complexType>
            <xs:attribute name="city" type="xs:string" use="required"/>
            <xs:attribute name="phone" type="xs:string" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="id" type="xs:string"/>
    </xs:complexType>
  </xs:element>
...