The xsl:attribute element is used to add an attribute value to an xsl:element element or general formatting element, or to an element created using xsl:copy. The attribute must be output immediately after the element, with no intervening character data. The name of the attribute is indicated by the name attribute and the value by the content of the xsl:attribute element.

The attribute name is interpreted as an attribute value template, so it may contain string expressions within curly braces. The full syntax of string expressions is outlined in XPath Expression Syntax.

The attribute value may be given either by a select attribute or by an enclosed sequence constructor. If the select attribute is used and the value is a sequence, then the items in the sequence are output space-separated.

The separator attribute can be used to specify an alternative separator.

For example, the following code creates a <FONT> element with several attributes:

<xsl:element name="FONT"> <xsl:attribute name="SIZE">4</xsl:attribute> <xsl:attribute name="FACE">Courier New</xsl:attribute> Some output text </xsl:element>

A new attribute type was added in XSLT 2.0. This indicates the data type of the value of the attribute. The value must either be a built-in type defined in XML Schema, for example xs:integer or xs:date, or a user-defined type defined in a schema imported using xsl:import-schema. Type annotations are only accessible if the attribute is added to a temporary tree that specifies validation="preserve". The value given to the attribute must be a string that conforms to the rules for the data type, as defined in XML Schema.

There are two main uses for the xsl:attribute element:

The xsl:attribute must be output immediately after the relevant element is generated: there must be no intervening character data (other than white space which is ignored). Saxon outputs the closing ">" of the element start tag as soon as something other than an attribute is written to the output stream, and rejects an attempt to output an attribute if there is no currently-open start tag. Any special characters within the attribute value will automatically be escaped (for example, "<" will be output as "&lt;")

If two attributes are output with the same name, the second one takes precedence.

New in XSLT 3.0 (and implemented in Saxon 9.5) is the attribute on-empty="expr" which defines an alternative result to be delivered if the attribute would otherwise be empty. The most likely setting is on-empty="()" which has the effect that if the attribute would otherwise be a zero-length string, it is not output at all. This feature is motivated by streaming, because the alternative construct <xsl:if test="child"><xsl:attribute name="x" select="child"></xsl:if> is not streamable.