Переопределение мощности элемента сложного типа. Является ли это возможным? - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу использовать предопределенный сложный тип с измененным количеством элементов для одного из его элементов. Как я могу сделать это без использования переопределения / переопределения (я не хочу разделять файл xsd). Это вообще возможно?

Пример: в случае события я хочу, чтобы дата рождения организатора (person_type) была обязательной. Но для каждого гостя (в том числе person_type) он должен быть необязательным.

Я пытался использовать ограничение / расширение, но оно не соответствует моим потребностям. Очевидно, что он работает с использованием 2 сложного типа (т.е. person_type1 / birth_date 1..1, person_type2 / birth_date 0..1), но он царь уродливого.

Как я могу использовать комплексный тип "person_type" в гостевом элементе с кардинальным изменением даты рождения?

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:complexType name="event_type">
      <xs:sequence>
         <xs:element name="event_name" type="xs:string"/>
         <xs:element name="organizer" type="person_type"/>
         <xs:element name="guests_list">
            <xs:complexType>
               <xs:sequence>
                  <xs:element name="guest" type="person_type" maxOccurs="99"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
   <xs:complexType name="person_type">
      <xs:sequence>
         <xs:element name="first_name" type="xs:string"/>
         <xs:element name="last_name" type="xs:string"/>
         <xs:element name="birth_date" type="xs:string"/>
      </xs:sequence>
   </xs:complexType>
   <xs:element name="event" type="event_type"/>
</xs:schema>

Для того, чтобы этот файл был действительным:

<?xml version="1.0" encoding="UTF-8"?>
<event>
   <event_name>Party !!</event_name>
   <organizer>
      <first_name>John</first_name>
      <last_name>Doe</last_name>
      <birth_date>01/01/1970</birth_date>
   </organizer>
   <guests_list>
      <guest>
         <first_name>Jane</first_name>
         <last_name>Doe</last_name>
      </guest>
      <guest>
         <first_name>Foo</first_name>
         <last_name>Bar</last_name>
      </guest>
   </guests_list>
</event>

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 09 апреля 2019

Я все больше склоняюсь использовать утверждения XSD 1.1 для такого рода вещей. Это гораздо удобнее, чем использовать ограничения и расширения.

В частности, определите complexType как либеральный, а затем определите зависящие от контекста ограничения в xs: assert в объявлении соответствующего элемента.

...