Specifies a value bound in an expression.
<xsl:variable name = QName select = Expression> </xsl:variable>
<xsl:variable>
must be empty.Number of occurrences | Unlimited |
Parent elements | xsl:attribute, xsl:comment, xsl:copy, xsl:element, xsl:for-each, xsl:if, xsl:otherwise, xsl:param, xsl:processing-instruction, xsl:stylesheet xsl:template, xsl:variable, xsl:when, xsl:with-param, output elements |
Child elements | xsl:apply-templates, xsl:attribute, xsl:call-template, xsl:choose, xsl:comment, xsl:copy, xsl:copy-of, xsl:element, xsl:for-each, xsl:if, xsl:processing-instruction, xsl:text, xsl:value-of, xsl:variable, output elements |
The value of the variable may be an object of any type that can be returned by an expression. The <xsl:variable>
element can specify the value of the variable in three alternative ways:
select
attribute, the value of the attribute must be an expression and the value of the variable is the object that results from evaluating the expression. In this case, the content of the element must be empty.select
attribute and has non-empty content such as one or more child nodes, the content specifies the value. The content is a template that is instantiated to give the value of the variable. The value is a result tree fragment equivalent to a node-set containing just a single root node having as children the sequence of nodes produced by instantiating the template. The base URI of the nodes in the result tree fragment is the base Uniform Resource Identifier (URI) of the variable-binding element.
An error occurs if a member of the sequence of nodes created by instantiating the template is an attribute node or a namespace node, because a root node cannot have an attribute node or a namespace node as a child.
select
attribute, the value of the variable is an empty string. Thus
<xsl:variable name="x"/>
is equivalent to
<xsl:variable name="x" select="''"/>
Note When a variable is used to select nodes by position, be careful not to do the following.
<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="item[$n]"/>
This will output the value of the first item element, because the variable "n" will be bound to a result-tree fragment, not a number. Instead, do either
<xsl:variable name="n" select="2"/>
...
<xsl:value-of select="item[$n]"/>
or
<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="item[number($n)]"/>
Note The following is a convenient way to specify the empty node-set as the default value of a parameter.
<xsl:param name="x" select="/.."/>
This example shows how to define a variable based on the values of other variables.
Note To test this example in Internet Explorer, you need to use a script. For more information, see Initiate XSLT in a Script.
XML File (books.xml)
Use the Sample XML File (books.xml). Below the line <?xml version='1.0'?>
, add the following line:
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
XSLT File (sample.xsl)
<?xml version='1.0'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <html> <body> <xsl:variable name="bookCount" select="count(//book)"/> <xsl:variable name="bookTotal" select="sum(//book/price)"/> <xsl:variable name="bookAverage" select="$bookTotal div $bookCount"/> <table border="1"> <tr> <td> <b>Title</b> </td> <td> <b>Price</b> </td> <td> <b>Average</b> </td> <td> <b>Difference</b> </td> </tr> <xsl:for-each select="//book"> <tr> <td> <xsl:value-of select="title"/> </td> <td align="right"> <xsl:value-of select="price"/> </td> <td align="right"> <xsl:value-of select="format-number($bookAverage, '#.00')"/> </td> <td align="right"> <xsl:value-of select="format-number(price - $bookAverage, '#.00')"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Output
This is the formatted output: