XSL Choose

XSL Conditional Coose


Where to put the Choose Condition

Take a new look at the XML document that you have seen in almost every chapter (or open it with IE5):

[code language=”xml”]
<?xml version="1.0" encoding="ISO8859-1" ?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
[/code]

To insert an conditional choose test against the content of the file, simply add an xsl:choose, xsl:when and xsl:otherwise elements to your XSL document like this:

<xsl:choose>
<xsl:when match=”.[ARTIST=’Bob Dylan’]”>
… some code …
</xsl:when>
<xsl:otherwise>
… some code ….
</xsl:otherwise>
</xsl:choose>

Now take a look at your slightly adjusted XSL stylesheet (or open it with IE5):

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <html>
  <body>
    <table border="2" bgcolor="yellow">
      <tr>
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="CATALOG/CD">
      	<tr>
        <td><xsl:value-of select="TITLE"/></td>
      	<xsl:choose>
          <xsl:when match=".[ARTIST='Bob Dylan']">
            <td bgcolor="#ff0000"><xsl:value-of select="ARTIST"/></td>
          </xsl:when>
          <xsl:otherwise>
            <td><xsl:value-of select="ARTIST"/></td>
          </xsl:otherwise>
        </xsl:choose>
	</tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

 


Transforming it on the Client

Here is the simple source code needed transform the XML file to HTML on the client (try it yourself):

<html>
<body>
<script language="javascript">
// Load XML 
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("cd_catalog.xml")

// Load the XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cd_catalog_filter.xsl")

// Transform
document.write(xml.transformNode(xsl))
</script>

</body>
</html>