XSLT Basic
XSLT Tutorial
XSL stands for EXtensible Stylesheet Language, and is a style sheet language for XML documents.XSLT stands for XSL Transformations. In this tutorial you will learn how to use XSLT to transform XML documents into other formats, like XHTML.
XSL Languages
XSL stands for EXtensible Stylesheet Language.
The World Wide Web Consortium (W3C) started to develop XSL because there was a need for an XML-based Stylesheet Language.
HTML uses predefined tags, and the meaning of each tag is well understood.
The <table> tag in HTML defines a table - and a browser knows how to display it.
Adding
styles to HTML elements are simple. Telling a browser to display an
element in a special font or color, is easy with CSS.
XML does not use predefined tags (we can use any tag-names we like), and therefore the meaning of each tag is not well understood.
A <table> tag could mean an HTML table, a piece of furniture, or something else - and a browser does not know how to display it.
XSL describes how the XML document should be displayed!
XSL consists of three parts:
- XSLT - a language for transforming XML documents
- XPath - a language for navigating in XML documents
- XSL-FO - a language for formatting XML documents
The rest of this tutorial is about XSLT - the language for transforming XML documents.
To learn more about XPath and XSL-FO, visit our XPath Tutorial and our XSL-FO Tutorial.
XSLT is a language for transforming XML documents into XHTML documents or to other XML documents.
XPath is a language for navigating in XML documents.
Before you continue you should have a basic understanding of the following:
- HTML / XHTML
- XML / XML Namespaces
- XPath
If you want to study these subjects first, find the tutorials on our Home page.
- XSLT stands for XSL Transformations
- XSLT is the most important part of XSL
- XSLT transforms an XML document into another XML document
- XSLT uses XPath to navigate in XML documents
- XSLT is a W3C Recommendation
XSLT is the most important part of XSL.
XSLT
is used to transform an XML document into another XML document, or
another type of document that is recognized by a browser, like HTML and
XHTML. Normally XSLT does this by transforming each XML element into an
(X)HTML element.
With
XSLT you can add/remove elements and attributes to or from the output
file. You can also rearrange and sort elements, perform tests and make
decisions about which elements to hide and display, and a lot more.
A common way to describe the transformation process is to say that XSLT transforms an XML source-tree into an XML result-tree.
XSLT
uses XPath to find information in an XML document. XPath is used to
navigate through elements and attributes in XML documents.
If you want to study XPath first, please read our XPath Tutorial.
In
the transformation process, XSLT uses XPath to define parts of the
source document that should match one or more predefined templates. When
a match is found, XSLT will transform the matching part of the source
document into the result document.
Example study: How to transform XML into XHTML using XSLT.
The details of this example will be explained in the next chapter.
The root element that declares the document to be an XSL style sheet is <xsl:stylesheet> or <xsl:transform>.
Note: <xsl:stylesheet> and <xsl:transform> are completely synonymous and either can be used!
The correct way to declare an XSL style sheet according to the W3C XSLT Recommendation is:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/ |
or:
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/ |
To get access to the XSLT elements, attributes and features we must declare the XSLT namespace at the top of the document.
The xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" points to the official W3C XSLT namespace. If you use this namespace, you must also include the attribute version="1.0".
We want to transform the following XML document ("cdcatalog.xml") into XHTML:
<?xml version="1.0" encoding="ISO-8859-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> . . </catalog> |
Then you create an XSL Style Sheet ("cdcatalog.xsl") with a transformation template:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/ <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> |
Add the XSL style sheet reference to your XML document ("cdcatalog.xml"):
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> <catalog> <cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <country>USA</country> <company>Columbia</company> <price>10.90</price> <year>1985</year> </cd> . . </catalog> |
If you have an XSLT compliant browser it will nicely transform your XML into XHTML.
The details of the example above will be explained in the next chapters.
An XSL style sheet consists of one or more set of rules that are called templates.
A template contains rules to apply when a specified node is matched.
The <xsl:template> element is used to build templates.
The match
attribute is used to associate a template with an XML element. The
match attribute can also be used to define a template for the entire XML
document. The value of the match attribute is an XPath expression (i.e.
match="/" defines the whole document).
Ok, let's look at a simplified version of the XSL file from the previous chapter:
|
Since an XSL style sheet is an XML document, it always begins with the XML declaration: <?xml version="1.0" encoding="ISO-8859-1"?>.
The next element, <xsl:stylesheet>, defines that this document is an XSLT style sheet document (along with the version number and XSLT namespace attributes).
The <xsl:template> element defines a template. The match="/" attribute associates the template with the root of the XML source document.
The content inside the <xsl:template> element defines some HTML to write to the output.
The last two lines define the end of the template and the end of the style sheet.
The
result from this example was a little disappointing, because no data
was copied from the XML document to the output. In the next chapter you
will learn how to use the <xsl:value-of> element to select values from the XML elements.
The <xsl:value-of> element is used to extract the value of a selected node.
The
<xsl:value-of> element can be used to extract the value of an XML
element and add it to the output stream of the transformation:
|
Note: The select
attribute in the example above, contains an XPath expression. An XPath
expression works like navigating a file system; a forward slash (/)
selects subdirectories.
The
result from the example above was a little disappointing; only one line
of data was copied from the XML document to the output. In the next
chapter you will learn how to use the <xsl:for-each> element to loop through the XML elements, and display all of the records.
The <xsl:for-each> element allows you to do looping in XSLT.
The XSL <xsl:for-each> element can be used to select every XML element of a specified node-set:
|
Note: The value of the select
attribute is an XPath expression. An XPath expression works like
navigating a file system; where a forward slash (/) selects
subdirectories.
We
can also filter the output from the XML file by adding a criterion to
the select attribute in the <xsl:for-each> element.
<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
Legal filter operators are:
- = (equal)
- != (not equal)
- < less than
- > greater than
Take a look at the adjusted XSL style sheet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/ <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd[artist='Bob Dylan']"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> |
XSLT <xsl:sort> Element
The <xsl:sort> element is used to sort the output.
To sort the output, simply add an <xsl:sort> element inside the <xsl:for-each> element in the XSL file:
|
Note: The select attribute indicates what XML element to sort on.
XSLT <xsl:if> Element
The <xsl:if> element is used to put a conditional test against the content of the XML file.
The <xsl:if> Element
To put a conditional if test against the content of the XML file, add an <xsl:if> element to the XSL document.
Syntax
<xsl:if test="expression">
...some output if the expression is true... </xsl:if> |
Where to Put the <xsl:if> Element
To add a conditional test, add the <xsl:if> element inside the <xsl:for-each> element in the XSL file:
Example
|
Note: The value of the required test attribute contains the expression to be evaluated.
The code above will only output the title and artist elements of the CDs that has a price that is higher than 10.
XSLT <xsl:choose> Element
The
<xsl:choose> element is used in conjunction with <xsl:when>
and <xsl:otherwise> to express multiple conditional tests.
The <xsl:choose> Element
Syntax
<xsl:choose>
<xsl:when test="expression"> ... some output ... </xsl:when> <xsl:otherwise> ... some output .... </xsl:otherwise> </xsl:choose> |
Where to put the Choose Condition
To
insert a multiple conditional test against the XML file, add the
<xsl:choose>, <xsl:when>, and <xsl:otherwise> elements
to the XSL file:
Example
|
The code above will add a pink background-color to the "Artist" column WHEN the price of the CD is higher than 10.
Another Example
Here is another example that contains two <xsl:when> elements:
Example
|
The
code above will add a pink background color to the "Artist" column WHEN
the price of the CD is higher than 10, and a grey background-color WHEN
the price of the CD is higher than 9 and lower or equal to 10.
The <xsl:apply-templates> element applies a template to the current element or to the current element's child nodes.
The <xsl:apply-templates> element applies a template to the current element or to the current element's child nodes.
If
we add a select attribute to the <xsl:apply-templates> element it
will process only the child element that matches the value of the
attribute. We can use the select attribute to specify the order in which
the child nodes are processed.
Look at the following XSL style sheet:
|
Since not all browsers support XSLT, one solution is to transform the XML to XHTML on the server.
DXU: transform from XML to HTML is done on the server side by ASP pages, which are also
on
the server. Basically everything is on server, it’s just a matter of
who is doing the transform, by Browser via javascript or by server via
ASP.
In
the previous chapter we explained how XSLT can be used to transform a
document from XML to XHTML in the browser. We created a JavaScript that
used an XML parser to do the transformation. The JavaScript solution
will not work in a browser that doesn't have an XML parser.
To
make XML data available to all kind of browsers, we must transform the
XML document on the SERVER and send it as XHTML back to the browser.
That's
another beauty of XSLT. One of the design goals for XSLT was to make it
possible to transform data from one format to another on a server,
returning readable data to all kinds of browsers.
Look at the XML document that you have seen in the previous chapters:
<?xml version="1.0" encoding="ISO-8859-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> . . </catalog> |
And the accompanying XSL style sheet:
<?xml version="1.0" encoding="ISO-8859-1"?
No comments:
Post a Comment