XSD Restrictions

Applying constraints and validation rules to data

🔒 XSD Restrictions

Restrictions define rules and constraints for data values in XML. They ensure data meets specific criteria like length, range, pattern, or allowed values.


<!-- Simple restriction example -->
<xs:simpleType name="ageType">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="120"/>
  </xs:restriction>
</xs:simpleType>
                                    

Types of Restrictions

XSD provides various restriction types to validate different aspects of data. These restrictions ensure data quality and consistency across XML documents.

📏

Length

Control string length

<xs:minLength value="5"/>
<xs:maxLength value="50"/>
🔢

Range

Set numeric boundaries

<xs:minInclusive value="1"/>
<xs:maxInclusive value="100"/>
🎯

Pattern

Match regular expressions

<xs:pattern value="[A-Z]{3}"/>
📋

Enumeration

Limit to specific values

<xs:enumeration value="Red"/>
<xs:enumeration value="Blue"/>

🔹 Length Restrictions

Control the length of string values using length, minLength, and maxLength.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- Exact length -->
  <xs:simpleType name="zipCodeType">
    <xs:restriction base="xs:string">
      <xs:length value="5"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Minimum and maximum length -->
  <xs:simpleType name="usernameType">
    <xs:restriction base="xs:string">
      <xs:minLength value="3"/>
      <xs:maxLength value="20"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="zipCode" type="zipCodeType"/>
  <xs:element name="username" type="usernameType"/>
  
</xs:schema>

Valid XML:

<zipCode>12345</zipCode>
<username>john_doe</username>

🔹 Numeric Range Restrictions

Set minimum and maximum values for numeric data types.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- Age between 0 and 120 -->
  <xs:simpleType name="ageType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Price greater than 0 -->
  <xs:simpleType name="priceType">
    <xs:restriction base="xs:decimal">
      <xs:minExclusive value="0"/>
      <xs:maxInclusive value="9999.99"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Percentage 0-100 -->
  <xs:simpleType name="percentType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="100"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="age" type="ageType"/>
  <xs:element name="price" type="priceType"/>
  <xs:element name="discount" type="percentType"/>
  
</xs:schema>

Valid XML:

<age>25</age>
<price>49.99</price>
<discount>15</discount>

🔹 Pattern Restrictions (Regular Expressions)

Use regular expressions to validate string formats like emails, phone numbers, and codes.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- Email pattern -->
  <xs:simpleType name="emailType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Phone number (XXX-XXX-XXXX) -->
  <xs:simpleType name="phoneType">
    <xs:restriction base="xs:string">
      <xs:pattern value="\d{3}-\d{3}-\d{4}"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Product code (ABC-1234) -->
  <xs:simpleType name="productCodeType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Z]{3}-[0-9]{4}"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="email" type="emailType"/>
  <xs:element name="phone" type="phoneType"/>
  <xs:element name="productCode" type="productCodeType"/>
  
</xs:schema>

Valid XML:

<email>[email protected]</email>
<phone>555-123-4567</phone>
<productCode>ABC-1234</productCode>

🔹 Enumeration Restrictions

Limit values to a specific set of allowed options.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- T-shirt sizes -->
  <xs:simpleType name="sizeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="XS"/>
      <xs:enumeration value="S"/>
      <xs:enumeration value="M"/>
      <xs:enumeration value="L"/>
      <xs:enumeration value="XL"/>
      <xs:enumeration value="XXL"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Order status -->
  <xs:simpleType name="statusType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Pending"/>
      <xs:enumeration value="Processing"/>
      <xs:enumeration value="Shipped"/>
      <xs:enumeration value="Delivered"/>
      <xs:enumeration value="Cancelled"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="size" type="sizeType"/>
  <xs:element name="status" type="statusType"/>
  
</xs:schema>

Valid XML:

<size>L</size>
<status>Shipped</status>

🔹 WhiteSpace Restrictions

Control how whitespace is handled in string values.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- Preserve all whitespace -->
  <xs:simpleType name="preserveType">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="preserve"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Replace tabs/newlines with spaces -->
  <xs:simpleType name="replaceType">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="replace"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Collapse multiple spaces to one -->
  <xs:simpleType name="collapseType">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse"/>
    </xs:restriction>
  </xs:simpleType>
  
</xs:schema>

🔹 Total Digits and Fraction Digits

Control precision for decimal numbers.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- Price with 2 decimal places -->
  <xs:simpleType name="priceType">
    <xs:restriction base="xs:decimal">
      <xs:totalDigits value="8"/>
      <xs:fractionDigits value="2"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Percentage with 1 decimal place -->
  <xs:simpleType name="percentType">
    <xs:restriction base="xs:decimal">
      <xs:totalDigits value="4"/>
      <xs:fractionDigits value="1"/>
      <xs:minInclusive value="0.0"/>
      <xs:maxInclusive value="100.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="price" type="priceType"/>
  <xs:element name="taxRate" type="percentType"/>
  
</xs:schema>

Valid XML:

<price>123456.78</price>
<taxRate>8.5</taxRate>

🔹 Combining Multiple Restrictions

Apply multiple restrictions to create complex validation rules.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <!-- Password with multiple rules -->
  <xs:simpleType name="passwordType">
    <xs:restriction base="xs:string">
      <xs:minLength value="8"/>
      <xs:maxLength value="20"/>
      <xs:pattern value=".*[A-Z].*"/> <!-- At least one uppercase -->
      <xs:pattern value=".*[a-z].*"/> <!-- At least one lowercase -->
      <xs:pattern value=".*[0-9].*"/> <!-- At least one digit -->
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Product SKU with format and length -->
  <xs:simpleType name="skuType">
    <xs:restriction base="xs:string">
      <xs:length value="10"/>
      <xs:pattern value="[A-Z]{2}[0-9]{8}"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="password" type="passwordType"/>
  <xs:element name="sku" type="skuType"/>
  
</xs:schema>

Valid XML:

<password>SecurePass123</password>
<sku>AB12345678</sku>

🔹 Restriction Best Practices

Follow these guidelines when applying restrictions to your schemas.

✅ Best Practices:

  • Be specific: Use appropriate restrictions for your data type
  • Document patterns: Add comments explaining complex regex patterns
  • Test thoroughly: Validate with both valid and invalid data
  • Use enumerations: For fixed sets of values instead of patterns
  • Consider user experience: Provide clear error messages
  • Balance strictness: Too strict can reject valid data
  • Reuse types: Define common restrictions once and reference them

🧠 Test Your Knowledge

Which restriction limits values to a specific set of options?