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