Using XSL Conditional Statements and Recursions XSLT allows different approaches to recursion. With the use of xsl:template (match) and xsl:foreach, developers can perform recursive task. XSL allows two elements for conditional processing, xsl:if and xsl:choose. With xsl:if a sequence constructor is evaluated only if the specified condition in a test attribute returns true. However with xsl:choose instruction supports selection of one choice when there are several possibilities. xsl:template (match) The xsl:template match uses the pattern defined in the match attribute to identify which nodes apply the rule defined in the template. If more than one template rule meets the match criteria, they are first considered in order of import precedence. The templates that have the highest import precedence are applied to the resultant document. If there is still more than one template rule that meets the match criteria and shares the same import precedence, they are next considered in order of priority. The priority is either given by the value of the priority attribute, or is a default priority that depends on the match pattern. <xsl:template name="name" match="pattern" priority=number> <!-- Content:(<xsl:param>*,template) --> </xsl:template> Example <!-- XSL Template with match --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xsl:stylesheet SYSTEM "http://commons.omniupdate.com/dtd/ standard.dtd"> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/ Transform" xmlns:ou="http://omniupdate.com/XSL/Variables"> <!-- Main Template --> <xsl:template match="/"> <!-- Template Content --> </xsl:template> </xsl:stylesheet> Attribute: name (optional): Specifies a name for the template. If this attribute is omitted, there must be a match attribute. Attribute: match (optional): Contains the match pattern for the template. If this attribute is omitted, there must be a name attribute. Attribute: priority (optional): A positive or negative integer or decimal number that denotes the priority of the template. OU Campus Using XSL Conditional Statements and Recursions Page 1 of 8 Once a match pattern is successful, the rules defined in the template are applied to every node satisfying the match pattern. OU Campus Using XSL Conditional Statements and Recursions Page 2 of 8 Example <!-- Source XSL FILE --> <root> <faculty> <first_name>John</first_name> <last_name>Doe</last_name> <department>Computer Science</department> <phone>123-234-1234</phone> </faculty> <faculty> <first_name>Peter</first_name> <last_name>Parker</last_name> <designation>Economics</designation> <phone>234-123-7890</phone> </faculty> <faculty> <first_name>Mary</first_name> <last_name>Jane</last_name> <designation></designation> <phone></phone> </faculty> </root> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xsl:stylesheet SYSTEM "http://commons.omniupdate.com/dtd/ standard.dtd"> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/ Transform" xmlns:ou="http://omniupdate.com/XSL/Variables"> <!-- Main Template --> <xsl:template match="/"> <!-- Template Content --> </xsl:template> </xsl:stylesheet> <!-- Recursive XSL Template --> <!DOCTYPE xsl:stylesheet SYSTEM "http://commons.omniupdate.com/dtd/ standard.dtd" > <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/ Transform"> <xsl:output method="html" indent="yes" encoding="UTF-8" omit-xmldeclaration="yes" /> <xsl:template match="/"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Faculty Table</title> </head> OU Campus <body> Using XSL Conditional Statements and Recursions Page 3 of 8 <table> xsl:for-each Recursion can also be accomplished using xsl:for-each . It allows developers to evaluate the sequence constructor within the xsl:for-each once for each item in that sequence. Using the same XML file as source, here is an example of xsl:for-each : OU Campus Using XSL Conditional Statements and Recursions Page 4 of 8 Example <!DOCTYPE xsl:stylesheet SYSTEM "http://commons.omniupdate.com/dtd/ standard.dtd" > <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/ Transform"> <xsl:output method="html" indent="yes" encoding="UTF-8" omit-xmldeclaration="yes" /> <xsl:template match="/"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Faculty Table</title> </head> <body> <table> <thead> <tr> <td>First Name</td> <td>Last Name</td> <td>Department</td> <td>Phone Number</td> </tr> </thead> <tbody> <xsl:for-each select="/root/faculty"> <tr> <td><xsl:value-of select="./first_name"/></td> <td><xsl:value-of select="./last_name"/></td> <td><xsl:value-of select="./department"/></td> <td><xsl:value-of select="./phone"/></td> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template> </xsl:stylesheet> xsl:if xsl:if OU Campus Using XSL Conditional Statements and Recursions Page 5 of 8 is used for conditional processing. It takes a mandatory test attribute, with a Boolean expression. <xsl:if test="expression"> <!-- Content: sequence-constructor --> </xsl:if> Example <!-- Test if it is raining --> <xsl:variable name="raining" select="'yes'"/> <xsl:if test="$raining='yes'" > Yes </xsl:if> Output Yes Attribute: test (mandatory): The Boolean condition to be tested. xsl:when xsl:when is always used as a child element of xsl:choose . It defines a condition to be tested and, if the condition is true, the action to be performed. <xsl:choose> <xsl:when test="expression"> <!-- Content: sequence-constructor --> </xsl:when> <xsl:choose> OU Campus Using XSL Conditional Statements and Recursions Page 6 of 8 Example <!-- Test if it is raining --> <xsl:variable name="raining" select="'yes'"/> <xsl:choose> <xsl:when test="$raining='yes'"> Yes </xsl:when> <xsl:when test="$raining='maybe'"> May be </xsl:when> </xsl:choose> Output Yes Attribute: test (mandatory): The Boolean condition to be tested. xsl:otherwise xsl:otherwise is always used as a child element of xsl:choose . It defines the action to be performed when none of the xsl:when conditions are satisfied. <xsl:choose> <xsl:when test="expression"> <!-- Content: sequence-constructor --> </xsl:when> <xsl:otherwise> <!-- Content: sequence-constructor --> </xsl:otherwise> <xsl:choose> OU Campus Using XSL Conditional Statements and Recursions Page 7 of 8 Example <!-- Test if it is raining --> <xsl:variable name="raining" select="'yes'"/> <xsl:choose> <xsl:when test="$raining='yes'"> Yes </xsl:when> <xsl:when test="$raining='maybe'"> May be </xsl:when> <xsl:when test="$raining='no'"> No </xsl:when> <xsl:otherwise> Don't know </xsl:otherwise> </xsl:choose> Output Yes Attribute: test (mandatory): The Boolean condition to be tested. OU Campus Using XSL Conditional Statements and Recursions Page 8 of 8
© Copyright 2026 Paperzz