How Does XSLT Type Enforce Validation Rules?
Schema-aware XSLT uses the type attribute on literal
result elements, instructions like xsl:element and
xsl:attribute, and document nodes to dynamically validate
and annotate newly constructed nodes against an imported W3C XML Schema.
By specifying a target simple or complex type, the transformation engine
verifies that the node’s content conforms strictly to the schema
definition during tree construction. If the content fails schema
constraints, the transformation halts with a dynamic error, ensuring
that the generated XML output maintains guaranteed type safety and
structural integrity.
Mechanics of Type-Driven Validation
When a stylesheet imports an XML Schema using
xsl:import-schema, the XSLT processor registers all
declared simple and complex types. Applying the type
attribute instructs the processor to validate the node against a
specific target definition rather than relying on context-based element
declarations.
For element validation, the syntax targets a declared type directly:
<price xsl:type="xs:decimal">19.99</price>During execution, the processor evaluates the text content of the
element. If the value cannot be converted or cast to the target type,
the engine raises a dynamic validation error (such as
XTTE1510 or XTTE1540, depending on
context).
For attribute validation, the type attribute operates on
xsl:attribute:
<xsl:attribute name="discount" type="xs:nonNegativeInteger" select="$discountRate" />The value of $discountRate must satisfy the facets
defined on xs:nonNegativeInteger (such as minimum value
constraints). If validation succeeds, the attribute node receives the
corresponding type annotation.
Difference
Between type and validation Attributes
Schema-aware XSLT provides two distinct mechanisms for validating
generated output nodes: the validation attribute and the
type attribute. These attributes are mutually exclusive;
specifying both on the same instruction causes a static compilation
error.
- The
typeattribute validates a node against a specific named simple or complex type regardless of the node's local name or parent element context. - The
validationattribute (strict,lax,preserve, orstrip) validates an element against top-level element declarations within the schema, matching the element by its expanded QName.
Using type offers finer control when constructing
anonymous structures or when applying generic schemas where element
names vary but data formats remain standardized.
Validation Rules for Simple and Complex Types
The type validation mechanism executes different rule sets based on whether the target is a simple type or a complex type.
Simple Types
When the type attribute names an atomic or list type
(such as xs:date, xs:integer, or a
user-defined restriction):
- The element must not contain any child element nodes.
- The combined string value of all child text nodes is evaluated
against the lexical space and facet restrictions (such as
pattern,minInclusive, orenumeration) of the target type. - Upon successful validation, the element's typed value becomes accessible to subsequent XPath operations as a typed instance (e.g., enabling direct arithmetic on numbers or date comparisons).
Complex Types
When validating against a complex type definition:
- The sequence and names of child elements must strictly match the
content model particles (
xs:sequence,xs:choice, orxs:all). - Any defined attributes must conform to their respective attribute declarations in the schema.
- Elements with simple content must satisfy the extension or restriction rules defined for their base types.
Error Handling and Transformation Integrity
Schema-aware processors enforce type constraints at runtime during tree construction. If an input value violates a constraint—such as providing an invalid date format or an out-of-range integer—the processor does not silently degrade to untyped data. Instead, it aborts processing with a fatal dynamic error unless caught by explicit error-handling constructs.
This fail-fast mechanism prevents downstream systems from receiving
malformed data and ensures that downstream template rules matching on
typed patterns (e.g., match="element(*, xs:decimal)")
execute only against verified XML fragments.