Creating XSLT documents

SHARE & COMMENT :

Introduction

XSLT is used for the transformation of XML documents into XHTML. We know that HTML uses predefined set of tags which can be interpreted by the browser. However this is not true for XML documents. XML does not use predefined set of tags. Hence, if we open an XML document in browser we cant expect the browser to display the document in some meaningful format.
This is where XSLT comes into picture. Using XSLT we can define rules for each XML element in the XML document. Those rules decide how to display the corresponding XML element. XSLT does a transformation of each XML element into a HTML element. With XSLT we can not only display the XML elements in a meaningful way but also filters the elements, sort the elements. XSLT can be compared with Cascading Style Sheets (CSS). CSS defines the formating rules for HTML tags, XSLT defines the formatting rules for XML tags.

We will be using the following XML document to understand the basic of XSLT :
File Name : employees.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<employees>
	<employee vertical="banking">
		<id>17452</id>
		<name>Jason</name>
		<experience>2</experience>
		<salary>35000</salary>
	</employee>

	<employee vertical="insurance">
		<id>14782</id>
		<name>Jim</name>
		<experience>3</experience>
		<salary>45000</salary>
	</employee>

	<employee vertical="telecom">
		<id>12563</id>
		<name>Charles</name>
		<experience>4</experience>
		<salary>55000</salary>
	</employee>
</employees>

Link the XSL Style Sheet to the XML Document

To apply XSLT formatting to the XML document we need to tell the XML document about the XSLT. We can do this by adding the following line to the XML document :

Creating XSLT documents

The root element

As with XML every XSLT document must also start with a root element. The root element should be or .
For E.g :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
or
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

By adding the XSLT namespace attribute, xmlns:xsl, access is provided to elements, attributes.
The value of xmlns:xsl points to the official W3C XSLT namespace. We must also include the atribute version.

Defining templates

In XSLT we can define templates. Templates define a set of rules for nodes. These rules produce a desired display for a node on which the template is applied. In XSLT templates can be defined using xsl:template element.

xsl:template element has a match attribute which associates a template with an XML element.
With the match element we can also associate a template with the entire document.

For E.g :

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>
 <body>
   <table border="1">
     <tr bgcolor="#9acd32">
       <th>Id</th>
       <th>Name</th>
     </tr>
   </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Output:

IdName

Explanation:
This is just a trivial example where we dont do much expect creating two headers. In the example above the xsl:template element associates the template to the root element. This is achieved by using match=”/”. This essesntially says if the xml root element is encountered then apply this template. Inside the template we define some HTML to display.

Extracting values of XML elements

We can extract the values of XML elements using the xsl:value-of element.
For E.g:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>
 <body>
   <table border="1">
     <tr bgcolor="#9acd32">
       <th>Id</th>
       <th>Name</th>
     </tr>
     <tr>
      <td><xsl:value-of select="employees/employee/id"/></td>
      <td><xsl:value-of select="employees/employee/name"/></td>
     </tr>
   </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Output:

IdName
17452Jason

Explanation:
This example does nothing much than just displaying the values of the first id and the name element encountered in the xml document. It skips the rest of id and the name elements. We can print all the missing elements using which we will see in the next section.

Select every XML element

The element allows us to perform iterations in the XML document.
For E.g :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>
 <body>
   <table border="1">
     <tr bgcolor="#9acd32">
       <th>Id</th>
       <th>Name</th>
     </tr>
     <xsl:for-each select="employees/employee">
     <tr>
      <td><xsl:value-of select="id"/></td>
      <td><xsl:value-of select="name"/></td>
     </tr>
     </xsl:for-each>
   </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Output:

IdName
17452Jason
14782Jim
12563Charles

Explanation:
In the example we can see that each of the element is iterated over and the values of the corresponding id and name elements are printed

Filtering the content

We can filter the result generated by XSLT. Using filtering we can display certain content and not display others.
For E.g :

Sorting the output

We can sort the output generated by XSLT by using the element.
For E.g:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
	<table border="1">
		<tr bgcolor="#9acd32">
			<th>Id</th>
			<th>Name</th>
		</tr>
		<xsl:for-each select="employees/employee">
		<xsl:sort select="name"/>
		<tr>
			<td><xsl:value-of select="id"/></td>
			<td><xsl:value-of select="name"/></td>
		</tr>
		</xsl:for-each>
	</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Output:

IdName
12563Charles
17452Jason
14782Jim

Conditional test

To test for certain condition on the content generated by XSLT we can use element.
For E.g :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>
 <body>
   <table border="1">
     <tr bgcolor="#9acd32">
       <th>Id</th>
       <th>Name</th>
     </tr>
     <xsl:for-each select="employees/employee">
     <xsl:if test="salary > 45000">
     <tr>
      <td><xsl:value-of select="id"/></td>
      <td><xsl:value-of select="name"/></td>
     </tr>
     </xsl:if>
     </xsl:for-each>
   </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Output:

IdName
12563Charles

Multiple conditional tests

XSLT does not provides an If-else construct which is normally available in programming languages. However we can test for multiple conditions using a similar sort of a construct called

Consider the following E.g:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
	<table border="1">
	<tr bgcolor="#9acd32">
		<th>Id</th>
		<th>Name</th>
	</tr>

	<xsl:for-each select="employees/employee">
	<xsl:choose>
	<xsl:when test="salary > 45000">
		<tr bgcolor="#F00E0E">
			<td><xsl:value-of select="id"/></td>
			<td><xsl:value-of select="name"/></td>
		</tr>
	</xsl:when>
	<xsl:otherwise>
		<tr bgcolor="#235CDB">
			<td><xsl:value-of select="id"/></td>
			<td><xsl:value-of select="name"/></td>
		</tr>
	</xsl:otherwise>
	</xsl:choose>
	</xsl:for-each>
	</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Output:

IdName
17452Jason
14782Jim
12563Charles

Explanation:
The example above explains the usage of element. Here we display employee rows in different colors based on a salary range

Apply Templates

We can apply a template to either of these :
- The root
- The current element
- The children of the current element

We can apply templates by using the element. The takes an attribute called select. If we add a select attribute, it tells XSLT processor to apply the template to the children of the element which matches the value of the select attribute. Lets look at an example :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

<xsl:template match="employee">

<xsl:apply-templates select="name"/>
<xsl:apply-templates select="salary"/>


</xsl:template><xsl:template match="name">
Name: <span style="color:#ff0000">
<xsl:value-of select="."/></span>

<br />

</xsl:template><xsl:template match="salary">
Salary: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />

</xsl:template>
</xsl:stylesheet>

Output:
Name:Jason
Salary:35000

Name:Jason
Salary:35000

Name:Jason
Salary:35000

Explanation:
The xsl:apply-templates in between the body tags declares that the template should be applied to the entire document.
When an employee element is encountered the matched template is executed. However, inside the employee template we instruct the XSLT processor to apply template to matching name element and salary element. In the matched template we define the rules to display the current element.

[Note: select="." refers to the current node]

also read:

Comments

comments

About Krishna Srinivasan

He is Founder and Chief Editor of JavaBeat. He has more than 8+ years of experience on developing Web applications. He writes about Spring, DOJO, JSF, Hibernate and many other emerging technologies in this blog.

Comments

  1. awesome tutorial..excellent work..

  2. Kumar Shorav says:

    This is very useful tuorial I was looking for…thanks for posting it.

    Thanks

    Kumar Shorav

Speak Your Mind

*

Close
Please support the site
By clicking any of these buttons you help our site to get better