Как сделать элемент XSD необходимым или не требуемым в зависимости от контекста?

У нас есть определение элемента Person, в котором мы хотим, чтобы в зависимости от что они делают. Например, если они добавляют Person, тогда требуются разные элементы для отправки по сравнению с обновлением Лица. Ниже в примере тип Person в настоящее время дублируется, что конечно, неправильно. Есть ли хороший способ представить это в xsd, чтобы мы могли повторно использовать тип Person.

<!--?xml version="1.0" encoding="UTF-8"?-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:complextype name="Person">
 <xs:annotation>
 <xs:documentation>This is the definition when changing a person</xs:documentation>
 </xs:annotation>
 <xs:sequence>
 <xs:element name="PartyName" type="xs:string" minoccurs="0" maxoccurs="1">
 <xs:element name="GenderCode" type="GenderCode_Type" minoccurs="0" maxoccurs="1">
 <xs:element name="BirthDate" type="xs:date" minoccurs="0" maxoccurs="1">
 </xs:element></xs:element></xs:element></xs:sequence>
 </xs:complextype>
 <xs:complextype name="Person">
 <xs:annotation>
 <xs:documentation>This is the definition when adding a person</xs:documentation>
 </xs:annotation>
 <xs:sequence>
 <xs:element name="PartyName" type="xs:string" minoccurs="1" maxoccurs="1">
 <xs:element name="GenderCode" type="GenderCode_Type" minoccurs="1" maxoccurs="1">
 <xs:element name="BirthDate" type="xs:date" minoccurs="0" maxoccurs="1">
 </xs:element></xs:element></xs:element></xs:sequence>
 </xs:complextype> 
</xs:schema>
1 ответ

Самый простой способ иметь два разных типа для элементов Person - использовать локальные объявления Person в двух разных контекстах, которые вы имеете в виду. Например, вы можете сказать:

<xs:element name="Add">
 <xs:complextype>
 <xs:sequence>
 <xs:element name="Person" type="AddPerson">
 </xs:element></xs:sequence>
 </xs:complextype>
</xs:element>
<xs:element name="Update">
 <xs:complextype>
 <xs:sequence>
 <xs:element name="Person" type="ChangePerson">
 </xs:element></xs:sequence>
 </xs:complextype>
</xs:element>

В этом примере предполагается, что вы переопределили два своих сложных типа: AddPerson и ChangePerson.

Если вы также хотите, чтобы два сложных типа были явно связаны, вы можете получить их как путем ограничения от общего типа Person.

<xs:complextype name="Person">
 <xs:annotation>
 <xs:documentation>This is the generic 
 definition for persons</xs:documentation>
 </xs:annotation>
 <xs:sequence>
 <xs:element name="PartyName" type="xs:string" minoccurs="0" maxoccurs="1">
 <xs:element name="GenderCode" type="GenderCode_Type" minoccurs="0" maxoccurs="1">
 <xs:element name="BirthDate" type="xs:date" minoccurs="0" maxoccurs="1">
 </xs:element></xs:element></xs:element></xs:sequence>
</xs:complextype>
<xs:complextype name="ChangePerson">
 <xs:annotation>
 <xs:documentation>This is the definition 
 when changing a person</xs:documentation>
 </xs:annotation>
 <xs:complexcontent>
 <xs:restriction base="Person">
 <xs:sequence>
 <xs:element name="PartyName" type="xs:string" minoccurs="0" maxoccurs="1">
 <xs:element name="GenderCode" type="GenderCode_Type" minoccurs="0" maxoccurs="1">
 <xs:element name="BirthDate" type="xs:date" minoccurs="0" maxoccurs="1">
 </xs:element></xs:element></xs:element></xs:sequence> 
 </xs:restriction>
 </xs:complexcontent>
</xs:complextype>
<xs:complextype name="AddPerson">
 <xs:annotation>
 <xs:documentation>This is the definition 
 when adding a person</xs:documentation>
 </xs:annotation>
 <xs:complexcontent>
 <xs:restriction base="Person">
 <xs:sequence>
 <xs:element name="PartyName" type="xs:string" minoccurs="1" maxoccurs="1">
 <xs:element name="GenderCode" type="GenderCode_Type" minoccurs="1" maxoccurs="1">
 <xs:element name="BirthDate" type="xs:date" minoccurs="0" maxoccurs="1">
 </xs:element></xs:element></xs:element></xs:sequence> 
 </xs:restriction>
 </xs:complexcontent>
</xs:complextype>

Здесь общий тип Person идентичен типу AddPerson; Я определил AddPerson, используя пустое ограничение только для симметрии вывода обоих типов, относящихся к операции, из родового типа.

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

licensed under cc by-sa 3.0 with attribution.