Документация / XSD
Уникальность и ключи
XML Schema умеет проверять уникальность значений и ссылочную целостность внутри документа — как первичные и внешние ключи в базе данных. Ограничения объявляются внутри элемента, в пределах которого действуют.
| Элемент | Значение |
|---|---|
xs:unique | Значения уникальны (если заданы) |
xs:key | Значения уникальны и обязательно присутствуют |
xs:keyref | Значение должно совпадать с одним из значений указанного xs:key |
Каждое ограничение состоит из:
xs:selector— выражение XPath: какие элементы проверяются (относительно элемента, где объявлено ограничение);xs:field— выражение XPath: какое значение внутри выбранного элемента сравнивается (элемент или атрибут@id). Полей может быть несколько — составной ключ.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="catalog">
<xs:complexType>
<xs:sequence>
<xs:element name="category" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="product" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="sku" type="xs:string" use="required"/>
<xs:attribute name="category" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="CategoryKey">
<xs:selector xpath="category"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:unique name="UniqueSku">
<xs:selector xpath="product"/>
<xs:field xpath="@sku"/>
</xs:unique>
<xs:keyref name="ProductCategory" refer="CategoryKey">
<xs:selector xpath="product"/>
<xs:field xpath="@category"/>
</xs:keyref>
</xs:element>
</xs:schema>
<catalog>
<category id="kitchen" name="Кухня"/>
<product sku="G-100" category="kitchen"/>
<product sku="G-101" category="kitchen"/>
</catalog>
Здесь ссылка ведёт на несуществующую категорию, а артикул повторяется:
<catalog>
<category id="kitchen" name="Кухня"/>
<product sku="G-100" category="garden"/>
<product sku="G-100" category="kitchen"/>
</catalog>
В выражениях допускается ограниченное подмножество XPath: пути по дочерним элементам, .// и атрибуты.
Если в схеме задан targetNamespace и elementFormDefault="qualified", в XPath нужны префиксы имён.
ID и IDREF
Более старый способ — типы xs:ID и xs:IDREF: значения ID уникальны во всём документе, а IDREF должен
ссылаться на существующий ID. Он проще, но менее гибкий: не поддерживает области действия и составные ключи,
а значения должны быть корректными именами XML (не могут начинаться с цифры).
Похожие инструменты
Обновлено: 30 сентября 2026 г.
