introductionto xslt
TRANSCRIPT
2
Introduction to XSLTAgenda
The X* Ecosystem (XSL, XPath, XQuery...)
XML Refresh/Terminology
XPath: Addresses for XML documents
XSLT Basics: template and value-of
XSLT Loops: apply-templates and for-each
XSLT Decisions: if and choose
XSLT Variables: variable and param
XSLT Extras: sort, copy-of, document…
Why/When XSLT?
3
The X* Ecosystem
• XSL(T): Extensible Stylesheet Language (Transforms)– Like a giant function with a domain of XML and a
range of XML, HTML and Text– XSL-FO (Formatting Objects) is a related,
graphics/print-oriented language• XPath: XML Path (addressing)– Like a filesystem path in an XML document– Also like RegEx– a language for navigating in XML documents
4
XML Refresh/Terminology
XML Nodes Processing instruction: <?pi ... ?> Element: <element /> or
<element></element> Attribute: <element attribute="value" /> Comment: <!-- comment --> Entity: & Text node (just plain text)
5
XML Refresh/Terminology
XML Syntax Rules Escape < > & (turn them into entities <
> &) Every document has exactly one root element Attribute values are always quoted Elements are case-sensitive (and are typically
lowercase) You don't have to put an xml processing
instruction at the top of your document
6
XPath: Addresses for XML
XPath Expressions/library
/library/book
/library/book/@name
/library/book[@name="The Fourth Civilization"]
/library/book[1]
//book[2]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
7
XPath: Addresses for XML
XPath Expressions/library
/library/book
/library/book/@name
/library/book[@name="The Fourth Civilization"]
/library/book[1]
//book[2]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
8
XPath: Addresses for XML
XPath Expressions/library
/library/book
/library/book/@name
/library/book[@name="The Fourth Civilization"]
/library/book[1]
//book[2]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
9
XPath: Addresses for XML
XPath Expressions/library
/library/book
/library/book/@name
/library/book[@name="The Fourth Civilization"]
/library/book[1]
//book[2]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>Predicate
10
XPath: Addresses for XML
XPath Expressions/library
/library/book
/library/book/@name
/library/book[@name="The Fourth Civilization"]
/library/book[1]
//book[2]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
11
XPath: Addresses for XML
XPath Expressions/library
/library/book
/library/book/@name
/library/book[@name="The Fourth Civilization"]
/library/book[1]
//book[2]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
12
XPath: Addresses for XML
XPath Node selectors
/library/*
/library/book[1]/text()
/library/node()[1]
.
<library>
<!-- comment --><book>The Principles
of Computer Hardware</book>
<book name="The Fourth Civilization" />
</library>
13
XPath: Addresses for XML
XPath Node selectors
/library/*
/library/book[1]/text()
/library/node()[1]
.
<library>
<!-- comment --><book>The Principles
of Computer Hardware</book>
<book name="The Fourth Civilization" />
</library>
14
XPath: Addresses for XML
XPath Node selectors
/library/*
/library/book[1]/text()
/library/node()[1]
.
<library>
<!-- comment --><book>The Principles
of Computer Hardware</book>
<book name="The Fourth Civilization" />
</library>
15
XPath: Addresses for XML
XPath Node selectors
/library/*
/library/book[1]/text()
/library/node()[1]
.
<library>
<!-- comment --><book>The Principles
of Computer Hardware</book>
<book name="The Fourth Civilization" />
</library>
Selects the "current" node
16
XPath: Addresses for XML
XPath Axes/library/child::book
(or /library/book for short)
/descendent-or-self::book(or //book for short)
//book[1]/parent::*(or //book[1]/.. for short)
//book[2]/preceding-sibling::book
//book[1]/attribute::name(or //book[1]/@name for short)
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
17
XPath: Addresses for XML
XPath Axes/library/child::book
(or /library/book for short)
/descendent-or-self::book(or //book for short)
//book[1]/parent::*(or //book[1]/.. for short)
//book[2]/preceding-sibling::book
//book[1]/attribute::name(or //book[1]/@name for short)
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
18
XPath: Addresses for XML
XPath Axes/library/child::book
(or /library/book for short)
/descendent-or-self::book(or //book for short)
//book[1]/parent::*(or //book[1]/.. for short)
//book[2]/preceding-sibling::book
//book[1]/attribute::name(or //book[1]/@name for short)
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
19
XPath: Addresses for XML
XPath Axes/library/child::book
(or /library/book for short)
/descendent-or-self::book(or //book for short)
//book[1]/parent::*(or //book[1]/.. for short)
//book[2]/preceding-sibling::book
//book[1]/attribute::name(or //book[1]/@name for short)
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
20
XPath: Addresses for XML
XPath Axes/library/child::book
(or /library/book for short)
/descendent-or-self::book(or //book for short)
//book[1]/parent::*(or //book[1]/.. for short)
//book[2]/preceding-sibling::book
//book[1]/attribute::name(or //book[1]/@name for short)
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
21
XPath: Addresses for XML
XPath Functions//book[last()]
count(//book)
name(/*)
//book[contains(@name, "C++")]
//book[not(contains(@name, "C++"))]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
22
XPath: Addresses for XML
XPath Functions//book[last()]
count(//book)
name(/*)
//book[contains(@name, "C++")]
//book[not(contains(@name, "C++"))]
Returns: 2<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
23
XPath: Addresses for XML
XPath Functions//book[last()]
count(//book)
name(/*)
//book[contains(@name, "C++")]
//book[not(contains(@name, "C++"))]
Returns: "library"<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
24
XPath: Addresses for XML
XPath Functions//book[last()]
count(//book)
name(/*)
//book[contains(@name, "C++")]
//book[not(contains(@name, "C++"))]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
25
XPath: Addresses for XML
XPath Functions//book[last()]
count(//book)
name(/*)
//book[contains(@name, "C++")]
//book[not(contains(@name, "C++"))]
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
26
XPath: Addresses for XML
Other Useful XPath Functionsposition() – provides the position in a list (nice for numbering a
sequence of nodes)
sum(xpath) – takes a sequence of nodes and adds up their numerical values – see also avg(), min(), max()
concat(string, string, …) – exactly what you think
string-length(string) – returns the number of characters
substring(string, start[, length]) – the first char is at 1
translate(source-string, find-string, replace-string) – looks for individual chars and replaces themExample: translate("ABCD", "BD", "bd") "AbCd"
27
XPath: Addresses for XML
XPath Operators//book[last() or
contains(@name, "C++")]
//book[string-length(@name) > 5]
//book[1] | //book[2]
Other operators:
and, =, >, <=, >=, !=, +, -, *, div, mod
Don't forget to escape < >!
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
28
XPath: Addresses for XML
XPath Operators//book[last() or
contains(@name, "C++")]
//book[string-length(@name) > 5]
//book[1] | //book[2]
Other operators:
and, =, >, <=, >=, !=, +, -, *, div, mod
Don't forget to escape < >!
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
29
XPath: Addresses for XML
XPath Operators//book[last() or
contains(@name, "C++")]
//book[string-length(@name) > 5]
//book[1] | //book[2]
Other operators:
and, =, >, <=, >=, !=, +, -, *, div, mod
Don't forget to escape < >!
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
30
XPath: Addresses for XML
XPath Operators//book[last() or
contains(@name, "C++")]
//book[string-length(@name) > 5]
//book[1] | //book[2]
Other operators:
and, =, >, <=, >=, !=, +, -, *, div, mod
Don't forget to escape < >!
<library>
<book name="C++ How to Program" />
<book name="The Fourth Civilization" />
</library>
31
XSLT Basics
• Try it out– Make an XML file– Make an XSLT file– Run the transform and view the transformed data
<xml />input
<xsl:… />transform
<xml />(or text)output
• <xsl:template> Element– It details what items from the source document it should handle
and uses its content to specify what should be added to the output when it is executed
– match attribute is used to associate a template with an XML element and define a template for the entire document. E.g emptyXSL.xsl
• <xsl:value-of> Element– used to evaluate an expression and add the result to the output– used to extract the value of an XML element and add it to the
output stream of the transformation• <xsl:for-each> Element– used to select every XML element of a specified node-set
• <xsl:apply-templates> Element– responsible for deciding which items in the source document
should be processed; they are then handled by the appropriate template
33
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind.</quote>
</person>
Sample OutputNeil Armstrong said "...one giant
leap for mankind."
Sample XSLT<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="text" /><xsl:template match="/person">
<xsl:value-of select="concat(name/@first, ' ', name/@last)" />
said "<xsl:value-of
select="quote" />"</xsl:template>
</xsl:stylesheet>
34
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind.</quote>
</person>
Sample OutputNeil Armstrong said "...one giant
leap for mankind."
Sample XSLT<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="text" /><xsl:template match="/person">
<xsl:value-of select="concat(name/@first, ' ', name/@last)" />
said "<xsl:value-of
select="quote" />"</xsl:template>
</xsl:stylesheet>
35
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind.</quote>
</person>
Sample OutputNeil Armstrong said "...one giant
leap for mankind."
Sample XSLT<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="text" /><xsl:template match="/person">
<xsl:value-of select="concat(name/@first, ' ', name/@last)" />
said "<xsl:value-of
select="quote" />"</xsl:template>
</xsl:stylesheet>
36
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind. </quote>
</person>
Sample Output<html><head><title>Neil
Armstrong</title></head>
<body><blockquote>…one giant leap for mankind.</blockquote>
</body></html>
Sample XSLT HTML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" /><xsl:template match="/person">
<html><head><title><xsl:value-of select="concat(
name/@first, ' ', name/@last)" />
</title></head><body><blockquote><xsl:value-of
select="quote" /></blockquote></body></html>
</xsl:template></xsl:stylesheet>
All well-formed
37
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind. </quote>
</person>
Sample Output<html><head><title>Neil
Armstrong</title></head>
<body><blockquote>…one giant leap for mankind.</blockquote>
</body></html>
Sample XSLT HTML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" /><xsl:template match="/person">
<html><head><title><xsl:value-of select="concat(
name/@first, ' ', name/@last)" />
</title></head><body><blockquote><xsl:value-of
select="quote" /> </blockquote></body></html>
</xsl:template></xsl:stylesheet>
38
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind. </quote>
</person>
Sample Output<quote><speaker firstname="Neil"
lastname="Armstrong"/> <text>…one giant leap for mankind.</text>
</quote>
Sample XSLT XML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" /><xsl:template match="/person">
<quote><speaker firstname="{name/@first}" lastname="{name/@last}"/>
<text><xsl:value-of select="quote" /></text>
</quote></xsl:template>
</xsl:stylesheet>
39
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind. </quote>
</person>
Sample Output<quote><speaker firstname="Neil"
lastname="Armstrong"/> <text>…one giant leap for mankind.</text>
</quote>
Sample XSLT XML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" /><xsl:template match="/person">
<quote><speaker firstname="{name/@first}" lastname="{name/@last}"/>
<text><xsl:value-of select="quote" /></text>
</quote></xsl:template>
</xsl:stylesheet>
40
XSLT Basics
Sample XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind. </quote>
</person>
Sample Output<quote><speaker firstname="Neil"
lastname="Armstrong"/> <text>…one giant leap for mankind.</text>
</quote>
Sample XSLT XML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" /><xsl:template match="/person">
<quote><speaker firstname="{name/@first}" lastname="{name/@last}"/>
<text><xsl:value-of select="quote" /></text>
</quote></xsl:template>
</xsl:stylesheet>
41
XSLT Loops: for-each
Sample XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Sample XSLT HTML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" /><xsl:template match="/zoo">
<html><head><title>Zoo</title></head><body>
<xsl:for-each select="*">
<h1><xsl:value-of select="name(.)" />
</h1></xsl:for-each></body></html>
</xsl:template></xsl:stylesheet>
42
XSLT Loops: for-each
Sample XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Result HTML<html><head><title>Zoo</title>
</head><body><h1>
birds</h1><h1>
mammals</h1>
</body></html>
43
XSLT Loops: for-each
Sample XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Sample XSLT HTML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" /><xsl:template match="/zoo">
<html><head><title>Zoo</title></head><body>
<xsl:for-each select="*"><h1><xsl:value-of select="name(.)" /></h1>
<ul><xsl:for-each select="*"><li><xsl:value-of select="name(.)" /> (<xsl:value-of select="@pop">)</li>
</xsl:for-each></ul></xsl:for-each></body></html>
</xsl:template></xsl:stylesheet>
44
XSLT Loops: for-each
Sample XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Result HTML<html><head><title>Zoo</title>
</head><body>
<h1>birds</h1><ul>
<li>albatross (4)</li> …</ul>
<h1>mammals</h1><ul>
<li>aardvark (5)</li>…
</ul></body></html>
45
XSLT Loops: apply-templates
<xsl:template match="birds | mammals">
<h1><xsl:value-of select="name(.)" /></h1><ul>
<xsl:for-each select="*"><li><xsl:value-of select="name(.)" /> (<xsl:value-of select="@pop"/>)</li>
</xsl:for-each></ul>
</xsl:template></xsl:stylesheet>
Sample XSLT <xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" />
<xsl:template match="/zoo"><html><head><title>Zoo</title></head><body>
<xsl:apply-templates select="*" />
</body></html>
</xsl:template>
46
XSLT Decisions: if
XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
XSLT…<xsl:template match="birds | mammals">
<h1><xsl:value-of select="name(.)" /> </h1><p>We have more than 2...</p><xsl:if test="*[@pop > 2]">
<ul>
<xsl:for-each select="*[@pop > 2]"><li><xsl:value-of select="name(.)" /></li>
</xsl:for-each></ul>
</xsl:if></xsl:template>…
47
XSLT Decisions: if
Sample XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Result HTML<html><head><title>Zoo</title></head><body>
<h1>birds</h1><p>We have more than 2...</p><ul>
<li>albatross</li><li>chickadee</li>
</ul>
<h1>mammals</h1><p>We have more than 2...</p><ul>
<li>aardvark</li><li>bat</li>
</ul></body></html>
48
XSLT Decisions: choose
XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
XSLT fragment<xsl:template match="birds | mammals">
<ul><xsl:for-each select="*">
<li><xsl:value-of select="name(.)" />(<xsl:choose>
<xsl:when test="@pop = 2">a couple</xsl:when>
<xsl:when test="@pop <= 5">a few</xsl:when>
<xsl:otherwise>many</xsl:otherwise></xsl:choose>)
</li></xsl:for-each></ul>
</xsl:template>
49
XSLT Decisions: choose
Sample XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Result HTML<html><head><title>Zoo</title></head><body>
<ul><li>albatross (a few)</li><li>buzzard (a couple)</li><li>chickadee (many)</li>
</ul><ul>
<li>aardvark (a few)</li><li>bat (many)</li><li>cheetah (a couple)</li>
</ul></body></html>
50
XSLT Variables: variable
XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
XSLT fragment<xsl:template match="birds | mammals">
<xsl:variable name="total-animals" select="sum(*/@pop)" />
<ul><xsl:for-each select="*">
<li><xsl:value-of select="name(.)" />(<xsl:value-of select="round(100 * @pop div $total-animals)"/>% of all <xsl:value-of select="name(..)"/>)
</li></xsl:for-each></ul>
</xsl:template>
51
XSLT Variables: variable
Source XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Result HTML<html><head><title>Zoo</title></head><body>
<ul><li>albatross (22% of all birds)</li><li>buzzard (11% of all birds)</li><li>chickadee (67% of all birds)</li>
</ul><ul>
<li>aardvark (2% of all mammals)</li><li>bat (97% of all mammals)</li><li>cheetah (1% of all mammals)</li>
</ul></body></html>
52
XSLT Variables: parameter
<xsl:template name="animal">
<xsl:param name="total" /><li>
<xsl:value-of select="name(.)" /> (<xsl:value-of select="round(100 * @pop div $total)"/>%)
</li></xsl:template>
XSLT fragments<xsl:template match="birds | mammals"><xsl:variable name="total-animals" select="sum(*/@pop)" />
<ul><xsl:for-each select="*"><xsl:call-template name="animal"><xsl:with-param name="total" value="$total-animals">
</xsl:call-template></xsl:for-each></ul>
</xsl:template>
53
XSLT Variables: param
<xsl:template name="animal">
<xsl:param name="total" /><li>
<xsl:value-of select="name(.)" /> (<xsl:value-of select="round(100 * @pop div $total)"/>%)
</li></xsl:template>
XSLT fragments<xsl:template match="birds | mammals"><xsl:variable name="total-animals" select="sum(*/@pop)" />
<ul><xsl:for-each select="*"><xsl:call-template name="animal"><xsl:with-param name="total" value="$total-animals">
</xsl:call-template></xsl:for-each></ul>
</xsl:template>
54
XSLT Variables: param
XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
XSLT fragment<xsl:param name="minimum-population" select="5" /><xsl:template match="birds | mammals">
<ul>
<xsl:for-each select="*[@pop >= $minimum-population]">
<li><xsl:value-of select="name(.)" />(<xsl:value-of select="@pop"/>)
</li></xsl:for-each></ul>
</xsl:template>
55
XSLT Variables: param
Source XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Result HTML<html><head><title>Zoo</title></head><body>
<ul><li>chickadee (12)</li>
</ul><ul>
<li>aardvark (5)</li><li>bat (200)</li>
</ul></body></html>
56
XSLT Extras: sort
XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
XSLT fragment<xsl:template match="birds | mammals">
<ul><xsl:for-each select="*">
<xsl:sort select="@pop" order="descending" data-type="number" />
<li><xsl:value-of select="name(.)" />
(<xsl:value-of select="@pop"/>)</li>
</xsl:for-each></ul></xsl:template>
57
XSLT Extras: sort
Source XML<zoo>
<birds><albatross
pop="4" /><buzzard
pop="2" /><chickadee
pop="12" /></birds><mammals>
<aardvark pop="5" />
<bat pop="200" /><cheetah
pop="2" /></mammals>
</zoo>
Result HTML<html><head><title>Zoo</title></head><body>
<ul><li>chickadee (12)</li><li>albatross (4)</li><li>buzzard (2)</li>
</ul><ul>
<li>bat (200)</li><li>aardvark (5)</li><li>cheetah (2)</li>
</ul></body></html>
58
XSLT Extras: copy-of
Source XML<person>
<name first="Neil" last="Armstrong" /><quote>...one giant leap for mankind. </quote>
</person>
XML Output<quote><name first="Neil"
last="Armstrong"/> <text>…one giant leap for mankind.</text>
</quote>
Sample XSLT XML<xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" /><xsl:template match="/person">
<quote><xsl:copy-of select="name" />
<text><xsl:value-of select="quote" /></text>
</quote></xsl:template>
</xsl:stylesheet>
59
XSLT Extras: more elements
• xsl:text – writes literal text to the output (useful for controlling whitespace or forcing exact, unescaped output)
• xsl:processing-instruction – writes a PI like <?php… ?> or <?xml-stylesheet… ?> to the output
• xsl:import and xsl:include – used to combine stylesheets (useful for XSLT libraries)
60
XSLT Extras: more functions
• document(url) – opens an XML document at the given location, returning its nodes as data that can be used by the templateExample: document('zoo.xml')/zoo//*[@pop = 2]
• current() – similar to "." except that it always refers to the current node, even when used inside predicatesExample://*[@pop = current()/@pop]
61
XSLT Extras: xml-stylesheet
To make an XML document show itself in a transformed format, add this to the top:<?xml-stylesheet type="text/xsl"
href="path/to/transform.xslt" ?>
This is particularly useful for XML like RSS
62
Why/When XSLT?
Web Standard
XSLT v 1.0 Recommended by W3C almost 10 years ago (it's stable and well understood)
Dozens of implementations and host languages (Java, .NET, PHP, C++…)
Wide tool support (Firefox, IE, Visual Studio, many text editors, full IDEs…)
No vendor lock-in
63
Why/When XSLT?
Very good at converting XML to XML, XHTML/HTML, or plain textMakes it easy to keep things well-formed
Uses XML syntax, so the only real new syntax is XPath (which is also used elsewhere)
XPath is far more compact than similar DOM code in JS/Java/C#/etc.
Can be interpreted (for quick development) or compiled (for maximum performance)