Enjoy ^_^
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:apply-templates select="//CCC"/>
</xsl:template>
<xsl:template match="CCC" priority="4">
<div style="color: green">
<!-- node name -->
<xsl:value-of select="name()"/>
<!-- text -->
<xsl:text> id=</xsl:text>
<!-- attribute -->
<xsl:value-of select="@id"/>
<xsl:value-of select="data/@color"/>
</div>
</xsl:template>
<!--match attribute-->
<xsl:template match="@id">
<b>
<i>
<xsl:value-of select="."/>
</i>
</b>
</xsl:template>
<!--hava attribute or not-->
<xsl:template match="car[@checked]">
<p>
<xsl:text>Car: </xsl:text>
<xsl:value-of select="@id"/>
</p>
</xsl:template>
<xsl:template match="car[not(@checked)]">
<p style="color: red;">
<xsl:text>Car: </xsl:text>
<xsl:value-of select="@id"/>
</p>
</xsl:template>
<!--any child -->
<!-- xsl:for-each -->
<xsl:for-each select="/source//*">
<!-- call template not apply-template-->
<xsl:call-template name="print"/>
</xsl:for-each>
<!-- called template-->
<xsl:template name="print">
<xsl:value-of select="./@id"/>
<!-- for each child -->
<xsl:for-each select="child::*">
<xsl:value-of select="./@id"/>
</xsl:for-each>
<!-- for each descendant -->
<xsl:for-each select="descendant::*">
</xsl:for-each>
<!-- xsl:for-each parent -->
<xsl:for-each select="parent::*">
<!--xsl:if test="not(@id)"-->
<xsl:if test="not(@id)">
<xsl:value-of select="name()"/>
</xsl:if>
<xsl:value-of select="./@id"/>
</xsl:for-each>
<!-- xsl:for-each ancester -->
<xsl:for-each select="ancestor::*">
</xsl:for-each>
<!-- xsl:for-each following-sibling-->
<xsl:for-each select="following-sibling::*">
</xsl:for-each>
<!-- xsl:for-each preceding-sibling -->
<xsl:for-each select="preceding-sibling::*">
</xsl:for-each>
<!--xsl:following-->
<xsl:for-each select="following::*">
</xsl:for-each>
<!-- preceding -->
<xsl:for-each select="preceding::*">
</xsl:for-each>
<!-- attribute -->
<xsl:for-each select="attribute::*">
</xsl:for-each>
<!-- namespace -->
<xsl:for-each select="namespace::*">
</xsl:for-each>
<!-- self -->
<xsl:for-each select="self::*">
</xsl:for-each>
<!-- descendant-or-self -->
<xsl:for-each select="descendant-or-self::*">
</xsl:for-each>
<!-- ancestor-or-self -->
<xsl:for-each select="ancestor-or-self ::*">
</xsl:for-each>
<!-- abbreviated -->
<xsl:value-of select="child::BBB"/>
<xsl:value-of select="BBB"/>
<xsl:value-of select="attribute::id"/>
<xsl:value-of select="@id"/>
<xsl:value-of select="parent::BBB"/>
<xsl:value-of select="../BBB"/>
<xsl:value-of select="name(/descendant-or-self::*)"/>
<xsl:value-of select="name(//*)"/>
<!-- The xsl:for-each instruction contains a template,
which is applied to each node selected with select attribute. -->
<xsl:for-each select="//BBB">
</xsl:for-each>
<!-- Nodes selected with xsl:for-each or xsl:apply-templates
can be sorted. -->
<xsl:for-each select="//name">
<xsl:sort order="ascending" select="."/>
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:for-each select="//name">
<xsl:sort order="descending" select="."/>
</xsl:for-each>
<xsl:apply-templates select="//name">
<xsl:sort order="descending" select="."/>
</xsl:apply-templates>
<!-- sorts can be in text and in numeric mode. -->
<xsl:sort data-type="text" select="@id"/>
<xsl:sort data-type="number" select="@id"/>
<!-- sorts upercase and lowercase letters firs -->
<xsl:sort case-order="upper-first" select="@id"/>
<xsl:sort case-order="lower-first" select="@id"/>
<!-- xsl:element generates elements in time of processing. -->
<!-- there are new element created around the value-->
<xsl:for-each select="//text">
<xsl:element name="{@size}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
<!-- xsl:attribute generates elements in time of processing.
It creates attribute in the element in which it is enclosed. -->
<!-- result is <TD style="color:green">green</TD>
attribute is created dynamicly-->
<TD>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="."/>
</xsl:attribute>
<xsl:value-of select="."/>
</TD>
<!-- Copy and copy-of constructs are used for nodes copying.
Copy element copies only the current node without children and attributes,
while copy-of copies everything. -->
<xsl:copy-of select="."/>
<xsl:copy/>
<!-- The xsl:copy element may have a use-attribute-sets attribute.
In this way attributes for copied element can be specified. -->
<!-- result is <h1 align="center" style="color:red">GREETING</h1>
add attributes-->
<xsl:copy use-attribute-sets="H1">
<xsl:value-of select="."/>
</xsl:copy>
<xsl:attribute-set name="H1">
<xsl:attribute name="align">center</xsl:attribute>
<xsl:attribute name="style">color:red</xsl:attribute>
</xsl:attribute-set>
<!-- xsl:if instruction enables conditional processing.-->
<!-- position function and last function -->
<xsl:for-each select="entry">
<xsl:value-of select="@name"/>
<xsl:if test="not (position()=last())">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<!-- xsl:choose element is used for selection between several possibilities. -->
<xsl:choose>
<xsl:when test="SUMMARY">
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
<!-- How to find out that some text starts with a number. -->
<xsl:if test="starts-with(translate(., '0123456789', '9999999999'), '9')">
</xsl:if>
<!-- demonstrates the default behaviour of xsl:number element -->
<!-- Numbering of individual chapter elements depends on position of the chapter element. -->
<!-- Each level of chapters is numbered independently. -->
<xsl:for-each select="//chapter">
<TR>
<TD>
<xsl:number/>
<!-- using level="multiple" will result a more reasonalbe answer -->
<xsl:number level="multiple"/>
</TD>
<TD>
<xsl:value-of select="./text()"/>
</TD>
</TR>
</xsl:for-each>
<!-- xsl:number inserts formated numbers into output. -->
<!-- The format is given with format attribute. -->
<!-- The attribute starts with format identificator followed by separator characters. -->
<xsl:number value="position()" format="1. "/>
<xsl:number value="position()" format="001. "/>
<xsl:number value="position()" format="a# "/>
<xsl:number value="position()" format="i: "/>
<xsl:number value="position()" format="I... "/>
<!-- examples of formatting of multilevel numbers. -->
<xsl:number level="multiple" format="1.A.a "/>
<xsl:number level="multiple" format="I-1-a:"/>
<!-- different ways of setting xsl:variable -->
<!-- setting xsl:variable -->
<!-- call the variable -->
<xsl:variable name="totalChapters">
<xsl:value-of select="count(//chapter)"/>
</xsl:variable>
<xsl:value-of select="$totalChapters"/>
<!-- or -->
<xsl:variable name="totalChapters" select="count(//chapter)"/>
<xsl:value-of select="$totalChapters"/>
<!-- setting xsl:param. -->
<xsl:param name="totalChapters">
<xsl:value-of select="count(//chapter)"/>
</xsl:param>
<xsl:value-of select="$totalChapters"/>
<!-- or -->
<xsl:param name="totalChapters" select="count(//chapter)"/>
<xsl:value-of select="$totalChapters"/>
<!-- A stylesheet can contain several variables of the same name. -->
<!-- demonstrates a way how to recover the value of global variable which has the same name as a local one. -->
<xsl:variable name="text">Chapter</xsl:variable>
<xsl:for-each select="//chapter">
<TR>
<TD>
<xsl:variable name="text">
<xsl:choose>
<xsl:when test="position() = 1">First chapter</xsl:when>
<xsl:when test="position()=last()">Last chapter</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$text"/>
</TD>
</TR>
</xsl:for-each>
<!-- Parameters for a template can be passed with xsl:with-param element. -->
<!-- If the template contains a xsl:param element with the same name as name attribute of xsl:with-param,
this value is used. -->
<xsl:apply-templates select=".">
<!-- this param will be passed -->
<xsl:with-param name="type">odd</xsl:with-param>
</xsl:apply-templates>
<xsl:apply-templates select="."/>
<xsl:template match="number">
<xsl:param name="type">even</xsl:param>
<xsl:value-of select="."/>
<xsl:text> (</xsl:text>
<xsl:value-of select="$type"/>
<xsl:text>)</xsl:text>
</xsl:template>
<!-- A variable can hold a result tree fragment. -->
<!-- The operations permitted on a result tree fragment are a subset of those permitted on a node-set. -->
<!-- An operation is permitted on a result tree fragment only if that operation would be permitted on a string
(the operation on the string may involve first converting the string to a number or boolean). -->
<!-- In particular, it is not permitted to use the /, //, and [] operators on result tree fragments.
When a permitted operation is performed on a result tree fragment,
it is performed exactly as it would be on the equivalent node-set. -->
<xsl:variable name="A1">
<xsl:copy-of select="//TABLE[1]"/>
</xsl:variable>
<xsl:variable name="A2">
<xsl:copy-of select="//TABLE[2]"/>
</xsl:variable>
<xsl:template match="/">
<xsl:copy-of select="$A2"/>
<xsl:copy-of select="$A1"/>
<xsl:copy-of select="$A2"/>
</xsl:template>
<!-- important difference in variable value specification -->
<!-- 1st and 3rd are valued first, 2nd and 4th are text -->
<xsl:with-param name="path1" select="//AAA/CCC/DDD"/>
<xsl:with-param name="path2">//AAA/CCC/DDD</xsl:with-param>
<xsl:variable name="var1" select="//AAA/CCC/text()"/>
<xsl:variable name="var2">//AAA/CCC/text()</xsl:variable>
<!-- Functions number transforms its argument into a number -->
<!-- string conversion -->
<!-- conversion of boolean values true and false. -->
<xsl:value-of select="number()"/>
<xsl:value-of select="number(false())"/>
<xsl:value-of select="number(true())"/>
<xsl:value-of select="number(5 > 7)"/>
<!-- subtraction and multiplication uses common syntax -->
<!-- Division syntax is less usual. Slash / is used in patterns
and so keyword div is used instead -->
<!-- Operator mod returns the remainder from a truncating division. -->
<xsl:value-of select="//number[1] + //number[2]"/>
<xsl:value-of select="//number[3] - //number[4]"/>
<xsl:value-of select="//number[5] * //number[6]"/>
<xsl:value-of select="//number[5] div //number[6]"/>
<xsl:value-of select="//number[5] mod //number[6]"/>
<!-- Function sum() sums all numbers in selected nodes -->
<xsl:value-of select="sum(//number)"/>
<!-- only odd ones -->
<xsl:value-of select="sum(//number[text() mod 2 = 1])"/>
<!-- Functions ceilng(), floor() and round() transform floating point
numbers into integers in the specified way. -->
<xsl:value-of select="floor(.)"/>
<xsl:value-of select="ceiling(.)"/>
<xsl:value-of select="round(.)"/>
<!-- Function string() transforms its argument into string.
This function is not usualy directly used in stylesheets as it is in most cases called by default -->
<xsl:value-of select="string(number($A))"/>
<!-- Test, if element value is a number -->
<xsl:if test="string(number(.))='NaN'"> is not a number</xsl:if>
<!-- strings are arguments of boolean() function.
A string is true if and only if its length is non-zero.
node-sets as arguments for boolean() function. -->
<xsl:value-of select="boolean(text())"/>
<!-- text transformed into numbers and then subjected to boolean() function. -->
<xsl:value-of select="boolean(number(text()))"/>
<!-- The boolean value of "0" is true if "0" is a string, but false if "0" is a number. -->
<xsl:value-of select="boolean(//text[text()='0'])"/>
<xsl:value-of select="boolean(number((//text[text()='0'])))"/>
<!-- compares "0" as a string and as a number. -->
<xsl:value-of select="boolean(/)"/>
<xsl:value-of select="boolean(//text)"/>
<xsl:value-of select="boolean(//text[23])"/>
<!-- The not function returns true if its argument is false, and false otherwise. -->
<xsl:value-of select="car[not(@checked)]"/>
<xsl:value-of select="car[@checked]"/>
<!-- Functions true() and false() are useful,
when some conditions are tested during programming. -->
<xsl:if test="true()">
<xsl:text>true </xsl:text>
</xsl:if>
<xsl:if test="not(false())">
<xsl:text>not false</xsl:text>
</xsl:if>
<!-- The lang function returns true or false depending on
whether the language of the context node as specified by xml:lang attributes
is the same as or is a sublanguage of the language specified by the argument string. -->
<P xml:lang="de">
<text xml:lang="cs">a</text>
<text xml:lang="en">and</text>
<text>und</text>
</P>
<xsl:choose>
<xsl:when test='lang("cs")'>
<xsl:text>Czech: </xsl:text>
</xsl:when>
<xsl:when test='lang("en")'>
<xsl:text>English: </xsl:text>
</xsl:when>
<xsl:when test='lang("de")'>
<xsl:text>German: </xsl:text>
</xsl:when>
</xsl:choose>
<!-- The string-length function returns the number of characters in the string. -->
<xsl:value-of select="string-length(.)"/>
<!-- The normalize-space function returns the argument string with white space normalized
by stripping leading and trailing whitespace
and replacing sequences of whitespace characters by a single space. -->
<xsl:value-of select="string-length(normalize-space(.))"/>
<!-- The translate function returns the first argument string with occurrences of characters
in the second argument string replaced by the character at the corresponding position
in the third argument string. -->
<xsl:value-of select="translate(//text,'egos','EGOS')"/>
<xsl:value-of select="translate(//text,'se','d')"/>
<!-- The position function returns a number equal to the context position and
the last function returns a number equal to the context size from the expression evaluation context. -->
<xsl:if test="position()=1">
<xsl:value-of select="name()"/>
</xsl:if>
<xsl:apply-templates select="//AAA[last()]//CCC"/>
<xsl:value-of select="last()"/>
<!-- The count function returns the number of nodes in the argument node-set. -->
<xsl:value-of select="count(//AAA)"/>
<xsl:value-of select="count(//CCC[text()])"/>
<xsl:value-of select="count(//doc/*) - count(following::ref)"/>
<!-- The id function selects elements by their unique ID -->
<xsl:value-of select="id('body')/text"/>
<xsl:value-of select="id('text1')"/>
<xsl:for-each select="//*[@*]">
</xsl:for-each>
<!-- Several id's can be provided at once -->
<xsl:apply-templates select="id('intro body end')"/>
<xsl:value-of select="id('intro body end')"/>
<xsl:value-of select="id('in bod end')"/>
<!-- An example of id function usage. -->
<xsl:apply-templates select="id(@id)">
<xsl:with-param name="nmbr">
<xsl:value-of select="position()"/>
</xsl:with-param>
</xsl:apply-templates>
<!-- Functions name, local-name, and namespace-uri() are used to
get informations about element and attribute names and namespaces. -->
<!-- xml source is on: http://www.zvon.org/xxl/XSLTutorial/Output/example53_ch13.html -->
<xsl:value-of select="name()"/>
<xsl:value-of select="local-name()"/>
<xsl:value-of select="namespace-uri()"/>
<!-- The xsl:output element allows stylesheet authors to specify how they wish the result tree to be output.-->
<!-- The html output method should not perform escaping for the content of the script and style elements -->
<xsl:output method="html"/>
<xsl:output method="xml"/>
<!-- The encoding attribute specifies the preferred encoding to be used. -->
<xsl:output method="html" encoding="UTF-8"/>
<xsl:output method="html" encoding="ISO-8859-1"/>
<!-- The text output method outputs the result tree by
outputting the string-value of every text node in the result tree in document order
without any escaping. Look at the source in your browser to see the output. -->
<xsl:output method="text"/>
<!-- The current function returns a node-set that has the current node as its only member. -->
<!-- For an outermost expression (an expression not occurring within another expression),
the current node is always the same as the context node. -->
<xsl:value-of select="./@name"/>
<xsl:value-of select="current()/@name"/>
<!-- However, within square brackets the current node is usually different from the context node. -->
<xsl:apply-templates select="BBB[./@name='first']"/>
<xsl:apply-templates select="BBB[current()/@name='first']"/>
<!-- Function generate-id generates id conforming to XML spec. -->
<xsl:value-of select="generate-id(//AAA) "/>
<xsl:value-of select="generate-id(//*[1]) "/>
<xsl:value-of select="generate-id(//AAA[1]) "/>
<xsl:attribute name="id">
<xsl:value-of select="generate-id()"/>
</xsl:attribute>
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
<!-- Other stylesheets can be imported (xsl:import) or included (xsl:include) into a stylesheet..
Importing a stylesheet is the same as including it except that definitions and template rules
in the importing stylesheet take precedence over template rules and definitions in the imported stylesheet. -->
<!-- included xsl could be included in other xsl -->
<xsl:import href="id3.xsl"/>
<xsl:include href="id2.xsl"/>
<xsl:value-of select="$id2"/>
<xsl:value-of select="$id3"/>
<!-- pay attention to how to add value to html attribute -->
<!-- result is <h3 style="color:red">red</h3> -->
<xsl:template match="AAA">
<h3 style="color:{.}">
<xsl:value-of select="."/>
</h3>
</xsl:template>
<!-- always finish xsl analyze, then match in xml, so when include or import the sequence may result
overite rules -->
<!-- You can use xsl:apply-imports element to get information from an imported template,
whose behaviour you are changing. -->
<!-- xsl-apply-imports works only for templates imported with xsl:import,
not for templates included with xsl:include -->
<!-- works -->
<xsl:import href="id2.xsl"/>
<xsl:template match="/*/*">
<EM>
<xsl:apply-imports/>
</EM>
</xsl:template>
<!-- not work -->
<xsl:include href="id2.xsl"/>
<xsl:template match="/*/*">
<EM>
<xsl:apply-imports/>
</EM>
</xsl:template>
<!-- overwrite -->
<xsl:import href="id2.xsl"/>
<xsl:template match="/*/*">
<EM>
<xsl:value-of select="name()"/>
</EM>
</xsl:template>
<!-- Import precedence is more important than priority precedence. -->
<!-- overwrite still work first, although included things maybe have higher priority,
but it could be overwrite by who include it. -->
</xsl:template>
</xsl:stylesheet>





















































































































































































































































































































































































































































































