2010-04-14 2 views
4

У меня есть следующие XML-строка:XML схема - как связать существование одного атрибута существование другого атрибута

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

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

Спасибо.

ответ

2

Концепция зависимостей (которую вы называете «привязкой») в 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> 
+0

возможно использовать = «требуется» необходима для «ID» атрибут - и хз: долго должно быть хорошее предположение для его типа. –

+1

Что делать, если у вас нет полного контроля над структурой схемы? Можно ли это сделать, используя структуру исходного сообщения? –