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