Top Banner
Introduction to XSLT
63

Introductionto xslt

Jul 25, 2015

Download

Education

kumar
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Introductionto xslt

Introduction to XSLT

Page 2: Introductionto xslt

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?

Page 3: Introductionto 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

Page 4: Introductionto xslt

4

XML Refresh/Terminology

XML Nodes Processing instruction: <?pi ... ?> Element: <element /> or

<element></element> Attribute: <element attribute="value" /> Comment: <!-- comment --> Entity: &amp; Text node (just plain text)

Page 5: Introductionto xslt

5

XML Refresh/Terminology

XML Syntax Rules Escape < > & (turn them into entities &lt;

&gt; &amp;) 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

Page 6: Introductionto xslt

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>

Page 7: Introductionto xslt

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>

Page 8: Introductionto xslt

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>

Page 9: Introductionto xslt

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

Page 10: Introductionto xslt

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>

Page 11: Introductionto xslt

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>

Page 12: Introductionto xslt

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>

Page 13: Introductionto xslt

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>

Page 14: Introductionto xslt

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>

Page 15: Introductionto xslt

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

Page 16: Introductionto xslt

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>

Page 17: Introductionto xslt

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>

Page 18: Introductionto xslt

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>

Page 19: Introductionto xslt

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>

Page 20: Introductionto xslt

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>

Page 21: Introductionto xslt

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>

Page 22: Introductionto xslt

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>

Page 23: Introductionto xslt

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>

Page 24: Introductionto xslt

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>

Page 25: Introductionto xslt

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>

Page 26: Introductionto xslt

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"

Page 27: Introductionto xslt

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>

Page 28: Introductionto xslt

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>

Page 29: Introductionto xslt

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>

Page 30: Introductionto xslt

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>

Page 31: Introductionto xslt

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

Page 32: Introductionto xslt

• <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

Page 33: Introductionto xslt

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>

Page 34: Introductionto xslt

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>

Page 35: Introductionto xslt

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>

Page 36: Introductionto xslt

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

Page 37: Introductionto xslt

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>

Page 38: Introductionto xslt

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>

Page 39: Introductionto xslt

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>

Page 40: Introductionto xslt

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>

Page 41: Introductionto xslt

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>

Page 42: Introductionto xslt

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>

Page 43: Introductionto xslt

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>

Page 44: Introductionto xslt

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>

Page 45: Introductionto xslt

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>

Page 46: Introductionto xslt

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 &gt; 2]">

<ul>

<xsl:for-each select="*[@pop &gt; 2]"><li><xsl:value-of select="name(.)" /></li>

</xsl:for-each></ul>

</xsl:if></xsl:template>…

Page 47: Introductionto xslt

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>

Page 48: Introductionto xslt

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 &lt;= 5">a few</xsl:when>

<xsl:otherwise>many</xsl:otherwise></xsl:choose>)

</li></xsl:for-each></ul>

</xsl:template>

Page 49: Introductionto xslt

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>

Page 50: Introductionto xslt

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>

Page 51: Introductionto xslt

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>

Page 52: Introductionto xslt

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>

Page 53: Introductionto xslt

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>

Page 54: Introductionto xslt

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 &gt;= $minimum-population]">

<li><xsl:value-of select="name(.)" />(<xsl:value-of select="@pop"/>)

</li></xsl:for-each></ul>

</xsl:template>

Page 55: Introductionto xslt

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>

Page 56: Introductionto xslt

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>

Page 57: Introductionto xslt

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>

Page 58: Introductionto xslt

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>

Page 59: Introductionto xslt

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)

Page 60: Introductionto xslt

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]

Page 61: Introductionto xslt

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

Page 62: Introductionto xslt

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

Page 63: Introductionto xslt

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)