Ограничения или фасеты для значений в XML схеме

Ограничения используются для того, чтобы определить приемлемые значения для XML элементов или атрибутов. Ограничения по XML элементам еще называют "фасетами".

Ограничения по значению

В следующем примере определяется элемент "age" с ограничением. В этом элементе предполагается указывать возраст человека, а возраст человека, как известно, не может быть меньше 0 и больше 120:


<xs:element name="age">
   <xs:simpleType>
      <xs:restriction base="xs:integer">
         <xs:minInclusive value="0"/>
         <xs:maxInclusive value="120"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

Ограничение по набору значений

Чтобы ограничить содержимое XML элемента неким набором приемлемых значений, следует использовать ограничитель enumeration.

В следующем примере определяется элемент "car" с ограничением. Его единственные приемлемые значения - Audi, Golf, BMW:


<xs:element name="car">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:enumeration value="Audi"/>
         <xs:enumeration value="Golf"/>
         <xs:enumeration value="BMW"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

Приведенный пример также можно записать следующим образом:


<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
   <xs:restriction base="xs:string">
      <xs:enumeration value="Audi"/>
      <xs:enumeration value="Golf"/>
      <xs:enumeration value="BMW"/>
   </xs:restriction>
</xs:simpleType>

В этом случае тип "carType" может быть использован другими элементами, так как он не является частью элемента "car".

Ограничения по серии значений

Чтобы ограничить содержимое XML элемента серией чисел или букв, следует использовать ограничитель pattern.

В следующем примере определяется элемент "letter" с ограничением. Его единственным допустимым значением может быть ОДНА буква в НИЖНЕМ РЕГИСТРЕ в диапазоне от "a" до "z":


<xs:element name="letter">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="[a-z]"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере определяется элемент "initials" с ограничением. Его единственным допустимым значением может быть ТРИ буквы в ВЕРХНЕМ РЕГИСТРЕ в диапазоне от "a" до "z":


<xs:element name="initials">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="[A-Z][A-Z][A-Z]"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере также определяется элемент "initials" с ограничением. Его единственным допустимым значением может быть ТРИ буквы в НИЖНЕМ ИЛИ ВЕРХНЕМ РЕГИСТРЕ в диапазоне от "a" до "z":


<xs:element name="initials">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере определяется элемент "choice" с ограничением. Его единственным допустимым значением может быть ОДНА буква из трех: x, y ИЛИ z:


<xs:element name="choice">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="[xyz]"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере определяется элемент "prodid" с ограничением. Его единственным допустимым значением может быть ПЯТЬ последовательных цифр, и каждая цифра должна быть в диапазоне от 0 до 9:


<xs:element name="prodid">
   <xs:simpleType>
      <xs:restriction base="xs:integer">
         <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

Другие ограничения по серии значений

В следующем примере определяется элемент "letter" с ограничением. Его допустимым значением является ноль или больше букв в нижнем регистре в диапазоне от a до z:


<xs:element name="letter">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="([a-z])*"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере также определяется элемент "letter" с ограничением. Его приемлемым значением будет одна или больше пара букв, при этом каждая пара должна содержать букву в нижнем регистре, за которой следует буква в верхнем регистре. Например, "sToP" будет соответствовать данному шаблону, а "Stop" или "STOP" или "stop" нет:


<xs:element name="letter">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="([a-z][A-Z])+"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере определяется элемент "gender" с ограничением. Его приемлемым значением будет только строка "male" ИЛИ "female":


<xs:element name="gender">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="male|female"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере определяется элемент "password" с ограничением. Его значением должна быть строка из 8 символов, и этими символами могут быть буквы в нижнем или верхнем регистре от a до z, либо цифры от 0 до 9:


<xs:element name="password">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:pattern value="[a-zA-Z0-9]{8}"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

Ограничения по пробельным символам

Чтобы определить, как будут восприниматься пробельные символы, используется ограничитель whiteSpace.

В следующем примере определяется элемент "address" с ограничением. Ограничитель whiteSpace установлен в значение "preserve", что указывает XML парсеру НЕ удалять никакие пробельные символы:


<xs:element name="address">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:whiteSpace value="preserve"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере также определяется элемент "address" с ограничением. Ограничитель whiteSpace установлен в значение "replace", что указывает XML парсеру ЗАМЕНИТЬ все пробельные символы (символы табуляции, пробела, конца строки и перевода каретки) символами пробела:


<xs:element name="address">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:whiteSpace value="replace"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере также определяется элемент  "address" с ограничением. Ограничитель whiteSpace установлен в значение "collapse", что указывает XML парсеру УДАЛИТЬ все пробельные символы (символы табуляции, пробела, конца строки и перевода каретки и конечного пробела удаляются, а множественные пробелы заменяются на одинарный символ пробела):


<xs:element name="address">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:whiteSpace value="collapse"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

Ограничения по длине

Чтобы ограничить длину значения элемента, следует использовать ограничители length, maxLength и minLength.

В следующем примере определяется элемент "password" с ограничением. Длина его значения должна быть точно 8 символов:


<xs:element name="password">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:length value="8"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

В следующем примере определяется другой элемент "password" с ограничением. Длина его значения должна быть минимум 5 и максимум 8 символов:


<xs:element name="password">
   <xs:simpleType>
      <xs:restriction base="xs:string">
         <xs:minLength value="5"/>
         <xs:maxLength value="8"/>
      </xs:restriction>
   </xs:simpleType>
</xs:element>

Ограничения для типов данных

ОграничительОписание
enumerationОпределяет список приемлемых значений
fractionDigitsОпределяет максимальное число знаков после десятичной запятой. Должно быть равно или больше нуля
lengthОпределяет точное число символов или объектов списка. Должно быть равно или больше нуля
maxExclusiveОпределяет верхнюю границу для числовых значений (значение должно быть меньше указанного здесь)
maxInclusiveОпределяет верхнюю границу для числовых значений (значение должно быть меньше или равно указанному здесь)
maxLengthОпределяет максимальное число символов или объектов списка. Должно быть равно или больше нуля
minExclusiveОпределяет нижнюю границу для числовых значений (значение должно быть больше указанного здесь)
minInclusiveОпределяет нижнюю границу для числовых значений (значение должно быть больше или равно указанному здесь)
minLengthОпределяет минимальное число символов или объектов списка. Должно быть равно или больше нуля
patternОпределяет точную последовательность приемлемых символов
totalDigitsОпределяет точное количество допустимых цифр. Должно быть больше нуля
whiteSpaceОпределяет способ обработки пробельных символов