Named item types
A named item type is an item type identified by an expanded QName:
namespace-uri, namespace-prefix and local name. These can be defined in XSLT or XQuery, and
used wherever an item type may appear (for example in a function signature or variable
declaration, or in instance of or cast as expressions).
Named item types are useful because they abstract away from the detail of how a type is
implemented: for example cx:complex is more meaningful than
record(r as xs:double, i as xs:double), and it creates more scope for
changing the way types are represented as the software evolves.
In XSLT, named item types can be defined using the top-level declaration xsl:item-type. For example:
<xsl:item-type name="cx:complex" as="record(r as xs:double, i as xs:double)"/> <xsl:function name="cx:complex" as="cx:complex"> <xsl:param name="r" as="xs:double"/> <xsl:param name="i" as="xs:double"/> <xsl:sequence select="map{'r':$r, 'i':$i}"/> </xsl:function> <xsl:function name="cx:add" as="cx:complex"> <xsl:param name="x" as="cx:complex"/> <xsl:param name="y" as="cx:complex"/> <xsl:sequence select="cx:complex($x?r + $y?r, $x?i + $y?i)"/> </xsl:function>XSLT-defined named item types are scoped to a package. The usual rules for import precedence apply.
Named item types can be used in XSLT 4.0 match patterns, for example:
<xsl:template match="~cx:complex[?i=0]">{?r}</xsl:template> <xsl:template match="~cx:complex">{?r}{if (?i ge 0) then '+' else ''}{?i}i</xsl:template>In XQuery, named item types can be declared in the query prolog. For example:
declare type cx:complex as record(r as xs:double, i as xs:double);