Документация / XSD

Составные типы

Составной тип (xs:complexType) описывает элемент со вложенными элементами и/или атрибутами. Состав вложенных элементов задаёт модель содержимого из трёх компоновщиков:

КомпоновщикЗначение
xs:sequenceЭлементы идут в указанном порядке
xs:choiceОдин из элементов (или групп) на выбор
xs:allВсе элементы в любом порядке, каждый не более одного раза

Компоновщики можно вкладывать друг в друга (кроме xs:all, который должен быть единственной моделью типа) и задавать им minOccurs/maxOccurs.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="Payer">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:choice>
        <xs:element name="inn" type="xs:string"/>
        <xs:element name="passport" type="xs:string"/>
      </xs:choice>
      <xs:element name="phone" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Settings">
    <xs:all>
      <xs:element name="language" type="xs:string"/>
      <xs:element name="theme" type="xs:string" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
  <xs:element name="payer" type="Payer"/>
  <xs:element name="settings" type="Settings"/>
</xs:schema>
<payer>
  <name>Иван Петров</name>
  <passport>4510 123456</passport>
</payer>

Виды содержимого

  • Только элементы — обычный случай (xs:sequence, xs:choice, xs:all).
  • Простое содержимое с атрибутами — xs:simpleContent + xs:extension: значение и атрибуты, например <price currency="RUB">100</price>.
  • Смешанное содержимое — mixed="true": текст вперемешку с элементами, как в документах с разметкой.
  • Пустой элемент — тип без модели содержимого, только с атрибутами.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="note">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element name="b" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="image">
    <xs:complexType>
      <xs:attribute name="src" type="xs:anyURI" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
<note>Срок оплаты — <b>3 дня</b> с даты счёта.</note>

Группы

xs:group и xs:attributeGroup — именованные фрагменты, которые подключаются в несколько типов через ref. Удобно для повторяющихся наборов полей: адрес, реквизиты, служебные атрибуты.

<xs:attributeGroup name="Audit">
  <xs:attribute name="createdBy" type="xs:string"/>
  <xs:attribute name="createdAt" type="xs:dateTime"/>
</xs:attributeGroup>
<xs:complexType name="Invoice">
  <xs:sequence>
    <xs:element name="number" type="xs:string"/>
  </xs:sequence>
  <xs:attributeGroup ref="Audit"/>
</xs:complexType>

Наследование типов

Составной тип можно построить на основе другого через xs:complexContent:

  • Расширение (xs:extension) — добавляет элементы в конец последовательности и новые атрибуты.
  • Ограничение (xs:restriction) — сужает базовый тип: убирает необязательные элементы, уменьшает maxOccurs. Модель содержимого при ограничении повторяют целиком.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="Address">
    <xs:sequence>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="street" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="RussianAddress">
    <xs:complexContent>
      <xs:extension base="Address">
        <xs:sequence>
          <xs:element name="postalCode" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="fiasId" type="xs:string"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="address" type="RussianAddress"/>
</xs:schema>
<address fiasId="0c5b2444-70a0-4932-980c-b4dc0d3f02b5">
  <city>Москва</city>
  <street>Тверская, 1</street>
  <postalCode>125009</postalCode>
</address>

Подстановка типов и элементов

  • В документе можно указать производный тип явно: <address xsi:type="RussianAddress"> там, где по схеме ожидается Address.
  • Группа подстановки (substitutionGroup) разрешает использовать вместо глобального элемента другой глобальный элемент производного типа.
  • Абстрактный тип или элемент (abstract="true") не может встречаться в документе напрямую — только его наследники.
  • final запрещает наследовать тип (расширением, ограничением или вообще), block — подставлять наследников в документе.

Обновлено: 30 сентября 2026 г.