Conditions with XSLT

Contact Us or call 1-877-932-8228
Conditions with XSLT

Conditions with XSLT

xsl:if

The <xsl:if> tag is used to create a simple if condition. Its test attribute holds the condition, which is written in the form of an XPath, often using the XPath operators in the "XPath Operators" table.

Code Sample:

FlowControl/Demos/BeatlesIf.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>
		<head>
			<title>Beatles</title>
		</head>
		<body>
			<table border="1">
			<tr>
				<th>First Name</th>
				<th>Last Name</th>
			</tr>
			<xsl:for-each select="beatles/beatle">
				<xsl:sort select="name/lastname" />
				<xsl:if test="not(@real='no')">
				<tr>
				<td><xsl:value-of select="name/firstname"/></td>
				<td><xsl:value-of select="name/lastname"/></td>
				</tr>
				</xsl:if>
			</xsl:for-each>
			</table>
		</body>
	</html>
</xsl:template>

</xsl:stylesheet>

The xsl:for-each loop causes XSLT to look at each beatle element. The nested xsl:if element uses XPath to test to see if the value of real attribute of the beatle element is no. It then negates the result with the not() function. This way beatle elements that have no real attribute and beatle elements that do have a real attribute with the value of ANYTHING BUT no will both be included in the result set.

When FlowControl/Demos/BeatlesIf.xml is transformed against FlowControl/Demos/BeatlesIf.xsl, the output looks like this in a browser.

Note that there are no <xsl:else> or <xsl:elseif> elements.

xsl:choose

For multi-level conditions, <xsl:choose> is used. It takes as children one or more <xsl:when> tags with an optional <xsl:otherwise> tag at the end.

Code Sample:

FlowControl/Demos/BeatlesChoose.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>
		<head>
			<title>Beatles</title>
		</head>
		<body>
			<table border="1">
			<tr>
				<th>First Name</th>
				<th>Last Name</th>
			</tr>
			<xsl:for-each select="beatles/beatle">
				<xsl:sort select="name/lastname" />
				<xsl:choose>
				<xsl:when test="not(@real='no')">
				<tr bgcolor="red">
				<td><xsl:value-of select="name/firstname"/></td>
				<td><xsl:value-of select="name/lastname"/></td>
				</tr>
				</xsl:when>
				<xsl:otherwise>
				<tr bgcolor="orange">
				<td><s><xsl:value-of select="name/firstname"/></s></td>
				<td><s><xsl:value-of select="name/lastname"/></s></td>
				</tr>
				</xsl:otherwise>
				</xsl:choose>
			</xsl:for-each>
			</table>
		</body>
	</html>
</xsl:template>

</xsl:stylesheet>

This code ouputs a table row with a red background for every real Beatle and a table row with an orange background for every fake Beatle. The fake Beatles are also crossed out with the <s> tag.

When FlowControl/Demos/BeatlesChoose.xml is transformed against FlowControl/Demos/BeatlesChoose.xsl, the output looks like this in a browser.

Next