Template Instructions
- xsl:apply-templates
- Find correct template to apply
- xsl:value-of
- Evaluates select and outputs value
- xsl:text
- Outputs text
- xsl:copy
- Copy target node from source to output
- xsl:copy-of
- Complete tree copy
- xsl:for-each
- Applies same template to multiple document nodes
- xsl:choose
- Conditional testing with otherwise and when
- xsl:if
- Conditional test
- xsl:call-template
- Calls a named template
- xsl:document
- Creates a new output file
- xsl:element
- Generates an element in the output with specified name
- xsl:attribute
- Generates attribute node and applies to element
- xsl:cdata
- Outputs a CDATA section in the output
- xsl:variable
- Defines a local or global variable
xsl:copy
<xsl:copy>
Copies the current node from the Source Tree to the Result Tree
Note: it does not copy the contents of the node, just the node itself
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output method="xml" indent="no"/> Puts an XML declaration
on the output, no indentation
<xsl:template match="*" > Matches any node in the XML tree
<xsl:copy> Copy this node to the output tree
<xsl:apply-templates /> Apply any templates to the node's children
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
xsl:copy-of
For copying the whole tree, rather than specific nodes, to the output, use xsl:copy-of:
<xsl:template match="thought" > <xsl:copy-of select="."/> </xsl:template>
thought node, its attributes, its descendants and all their attributes are copied to the output tree
xsl:for-each
<xsl:for-each select="...">
- Selects a set of nodes for processing
- Performs the same processing on each node in the node-set
- The nodes in the node-set are processed in document order unless sort instructions appear
- Document order is the order of traversal of the tree
- A node comes before its attributes
- Its attributes come before its children
- No order of attributes is defined
- Template actively defines the order in which processing takes place
- A single template creates the complete Output Tree
Here is an example of an XML file:
- Many XML documents contain multiple records that are similar
- Templates need to be applied to all or some of these
<cdlist>
<cd>
<artist>Aatabou, Najat</artist>
<title>The Voice of the Atlas</title>
<label></label>
<catalog>CDORBD 069</catalog>
<filed>C05 World</filed>
<playlist>
<work>Baghi narajah</work>
<work>Finetriki</work>
<work>Shouffi rhirou</work>
<work>Lila ya s'haba</work>
<work>Ouardatte lajnane</work>
<work>Ditih</work>
</playlist>
</cd>
- - -
</cdlist>
xsl:for-each
<xsl:template match="cdlist"> The context node
<xsl:for-each select="cd"> Each cd becomes the current node in turn
<hr />
<h2> <xsl:value-of select="artist"/></h2> child of current node
<h2><xsl:value-of select="title"/></h2>
<table summary="cd stats" width="80%">
<col width="20%" /><col width="20%" /><col width="20%" /><col width="20%" />
<thead>
<tr><th>Label</th><th>Catalog Number</th><th>Stored At</th></tr>
</thead><tbody>
<tr>
<td><xsl:value-of select="label"/></td>
<td><xsl:value-of select="catalog"/></td>
<td><xsl:value-of select="filed"/></td>
</tr>
</tbody></table>
<h3>Playlist</h3>
<ul>
<xsl:for-each select="playlist/work"> Each work is the current node in turn
<li><xsl:value-of select="." /></li>
</xsl:for-each>
</ul>
</xsl:for-each>
<hr />
</xsl:template>
Sorting
<xsl:sort select="xxx" order="" case-order="" data-type=""/>
- Instead of document order, specifies a different order for processing child nodes
- Can be a child of xsl:apply-templates or xsl:for-each
- Within xsl:for-each it must be before any other instructions
- Several xsl:sort are allowed and the first is the major sort, the minor sort on the next and so on
- select attribute defines the sort key. Default is the text value of the node-set selected
- order can have values ascending or descending
- case-order can have values upper-first or lower-first
- data-type can have values text or number to decide whether values are sorted alphabetically or numerically. Default is alphabetic
- data-type="text" puts 10 before 5 while data-type="number" puts 5 before 10
- The select value can be complex and include doing arithmetic so this is a sophisticated operation
xsl:if
<xsl:if test=".." > . . . </xsl:if>
- Contents of <xsl:if> element only obeyed if test is true:
- If test result is a node-set, true if node-set contains one or more nodes
- If test result is a string, true if string is non-empty
- If test result is a number, true if value is non-zero
- If test result is a truth value, depends on the truth value
- Only CDs satisfying the test are retained
<xsl:template match="cdlist"> <xsl:for-each select="cd"> <xsl:if test="filed[. = 'C05 World']"> <tr> <td style="color:blue;font-weight:bold"><xsl:value-of select="artist"/></td> <td style="color:red;font-weight:bold"><xsl:value-of select="title"/></td> <td style="color:darkgray;font-weight:bold"><xsl:value-of select="filed"/> </td> </tr> </xsl:if> </xsl:for-each> </xsl:template>
Filtering via <xsl:choose>
<xsl:choose> <xsl:when test=".."> ... </xsl:when> <xsl:when test=".."> ... </xsl:when> <xsl:otherwise> . . . </xsl:otherwise> </xsl:choose>
- xsl:choose provides either or processing
- Set of xsl:when elements tested in order
- If none match, xsl:otherwise is obeyed
For example, colour code the different types of CD
Colour Code the CDs
<xsl:for-each select="cd">
<tr>
<xsl:choose>
<xsl:when test="filed[. = 'C05 World']">
<td style="color:red">
<xsl:value-of select="artist"/>
</td>
<td>
<xsl:value-of select="title"/>
</td>
</xsl:when>
<xsl:when test="filed[. = 'C06 Country']"><td style="color:blue">...</xsl:when>
<xsl:when test="filed[. = 'C11 Jazz Trad']"><td style="color:green">...</xsl:when>
<xsl:when test="filed[. = 'C20 Fado']"><td style="color:violet">...</xsl:when>
<xsl:when test="filed[. = 'C01 Pop']"><td style="color:gray">...</xsl:when>
<xsl:when test="filed[. = 'C07 Cajun']"><td style="color:brown">...</xsl:when>
<xsl:when test="filed[. = 'C03 Jazz Vocal']"><td style="color:yellow">...
</xsl:when>
<xsl:otherwise><td style="color:black">...</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
There are other XSLT instructions but these give a flavour of what you can do.