Документация / 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 г.
