What Is the Role of the as Attribute in XSLT?
The as attribute in XSLT (introduced in XSLT 2.0 and
continued in XSLT 3.0) provides strict type declarations for variables,
parameters, templates, and stylesheet functions. By defining the exact
sequence type an element must contain or return, the as
attribute enforces compile-time and runtime type safety, prevents
accidental document node wrapping, and allows XSLT processors to
optimize memory and execution performance.
Strict Type Checking and Validation
Without the as attribute, XSLT variables and functions
operate dynamically, accepting any sequence of items. Adding the
as attribute specifies a SequenceType—consisting of an item
type (such as xs:string, xs:integer,
element(), or node()) and an optional
occurrence indicator:
?allows zero or one item (e.g.,as="xs:integer?")*allows zero or more items (e.g.,as="element(item)*")+requires one or more items (e.g.,as="xs:string+")- No indicator requires exactly one item (e.g.,
as="xs:boolean")
When a variable value or function return violates this declared type,
the XSLT processor immediately raises a static or dynamic type error
(XTTE0570 for variables, XTTE0780 for
functions). This early failure model catches bugs during development
rather than allowing invalid data to propagate silently through
downstream template matches.
Preventing Document Node Wrapping
A major behavioral distinction in XSLT occurs when constructing
variable values containing complex content. When an
xsl:variable contains sequence constructors without an
as attribute, the processor constructs a new document node
(a temporary tree) and places the generated nodes inside it.
<!-- Without 'as': Creates a new document node containing a text node -->
<xsl:variable name="total">
<xsl:value-of select="sum(//price)"/>
</xsl:variable>
<!-- With 'as': Directly binds the variable to an atomic integer -->
<xsl:variable name="total" as="xs:decimal" select="sum(//price)"/>In the first example, $total evaluates to a document
node, requiring string conversion whenever used in arithmetic
operations. In the second example, $total evaluates
directly to an atomic xs:decimal value. Using the
as attribute prevents unnecessary tree construction,
preserving object identity and reducing memory overhead.
Enforcing Function Signatures and Return Types
In custom stylesheet functions (xsl:function), the
as attribute defines both the expected argument types and
the final return type:
<xsl:function name="custom:format-price" as="xs:string">
<xsl:param name="amount" as="xs:decimal"/>
<xsl:param name="currency" as="xs:string"/>
<xsl:sequence select="concat($currency, ' ', format-number($amount, '#,##0.00'))"/>
</xsl:function>Declaring parameter types ensures that callers pass compatible data types. If an argument does not match, standard XPath function conversion rules or dynamic errors apply automatically. Declaring the function return type guarantees that the function yields the exact data structure expected by calling expressions.
Performance Optimization
The presence of as attributes gives the XSLT compiler
explicit information about data types and cardinalities. Processors can
avoid runtime type inspections, skip intermediate node building, inline
computations, and generate optimized bytecode. In large-scale
transformations, consistent type annotations via the as
attribute significantly lower execution times and memory footprints.