xsl:template

advertisement
XSLT processing & control
Datamodellering 2006
1
Onderwerpen




Hoe verwerkt een XSLT processor de XML
inputtekst?
Wat zijn de uitgangspunten bij het schrijven
van een XSLT-stylesheet?
Welke control structures zijn er?
Niet: XPath, zie daarvoor en voor andere
XSLT-zaken bijvoorbeeld de XSLT Reference
van ZVON en stof UWT:
http://www.zvon.org/xxl/XSLTreference/Output/index.html
2
XML document tree
root
<?xml version="1.0"?>
node
<!-- Dee-licious! -->
<sandwich
xmlns="http://www.food.org/ns">
<ingredient type="grape">
jelly</ingredient>
<ingredient>
<?knife spread thickly?>
peanut-butter
</ingredient>
<ingredient>
bread
<!-- white bread, preferably -->
</ingredient>
</sandwich>
root
element
3
Nodes in de XSLT-boom

Root node (= document node)


Element





correspondeert met een attribuut van een element in een XML document
heeft een element als parent, maar wordt niet als een gewoon child
behandeld in XSLT
Text


correspondeert met element in XML document
Attribute


een onzichtbaar punt boven het root element
de tekstuele inhoud van het document
Comment
Processing instruction
Namespace
4
Van boom tot boom
Style
sheet
Stylesheet
tree
Result
Tree
Source
tree
Source
document
Result
Document
Transformatie
proces
5
Template rules



De transformatie is op te vatten als een reis door de
input-boom, waarbij stapsgewijs de output-boom
wordt opgebouwd
XSLT-instructies sturen dit proces = toepassen van:
template rules



specificeren de transformaties
expliciet in de XSLT-file of built-in in de XSLT-processor
bestaan twee delen:



een actie
een pattern (het match-attribute)  op welk deel van de
input-boom de actie moet worden toegepast
Voorbeeld:
<xsl:template name="Booklist" match="booklist">
6
Default situatie


Schrijven we geen uitvoerige template rules, dan
toch output.
Voorbeeld:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform
"version="1.0">
<xsl:template name="Basic">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>

dit doorloopt de hele input tree (depth first) en geeft
alle text weer
7
Sturing template-gebruik





<xsl:apply-templates/>
<xsl:apply-templates select=""/>
<xsl:for-each select=""/>
in combinatie met:
<xsl:call-template name=""/>
of:
<xsl:call-template name="">
<xsl:with-param name="">
value
</xsl:with-param>
</xsl:call-template>
8
XSLT processing model


XSLT-processor leest de input tree.
Ongeacht de inhoud van de XSLT-file, altijd eerst de
virtual call:
<xsl: apply-templates select="/">





 root node wordt current node
 call template rule die root node matcht  alle nodes in
result tree.
Processor loopt input tree verder af en zoekt meest
specifieke, expliciet vermelde template rule die
matcht.
XPath om matching-expressie te definiëren.
Debugger in een goede editor  het pad volgen.
9
Voorbeeld 1

XML

<?xml version="1.0"
encoding="UTF-8"?>
<doc>
<a>A</a>
<b>B1</b>
<b>B2</b>
<c>C
<d>D</d>
</c>
</doc>
output:
Dit is een B
Dit is een B
C
D
<xsl:apply templates/>
in combinatie met
built-in rules
XSLT
<?xml version="1.0" encoding="UTF8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/199
9/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="a">
<xsl:apply-templates
select="b"/>
</xsl:template>
<xsl:template match="b">
Dit is een B
</xsl:template>
</xsl:stylesheet>
10
1.1 Start
Debugger (in XML-Spy)
let op:
context = document root
context
11
1.2 Root node
Debugger
gebruik van built-in rule
12
1.3 Node <doc>
Debugger
• Input-boom
verder afgelopen
• <doc>: geen explicit
rule  built-in rule
13
1.4 Node <a>
Debugger
• Komt bij <a>
• Wel explicit rule 
maar geen output
14
1.5 Select <b>
Debugger
• Komt bij <a>
• Wel explicit rule 
maar geen output
15
1.6 Node <b>B1
Debugger
• Wel explicit rule
voor <b> 
output bij B1
16
1.7 Node <b>B2
Debugger
• Weer explicit rule
voor <b> 
output bij B2
17
1.8 Andere nodes
Debugger
• Output  result tree
• Geen passende
explicit rules meer
18
1.9 Node <c>
Debugger
19
1.10 Node <d>
Debugger
20
<xsl:for-each/>
in combinatie met
built-in rules
Voorbeeld 2

XML

<?xml version="1.0"
encoding="UTF-8"?>
<doc>
<a>A</a>
<b>B1</b>
<b>B2</b>
<c>C
<d>D</d>
</c>
</doc>
output:
Dit is B1
Dit is B2
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/X
SL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="doc">
<xsl:for-each select="b">
<xsl:call-template name="T1"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="T1">
Dit is <xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
21
Voorbeel 2 - trace


Debugger (in oXygen)
De trace list geeft
het pad weer dat de
XSLT-processor
heeft gevolgd
Symbolen:


 enter
 leave
22
Wanneer welke stijl?
Globale vuistregel:

<apply templates> wanneer het
voorkomen van elementen betrekkelijk
onvoorspelbaar is


b.v. bold, italic, afbeeldigen in tekst etc.
<for-each> wanneer er een regelmatige,
bekende datastructuur is

b.v. een databaserecord-structuur of vaste
volgorde van hoofdstukken, secties, etc.
23
Parameters - 1

XSLT-templates kunnen parameters hebben:
<xsl:template name="calcArea"
<xsl:param name="width"/>
<xsl:param name="height"/>
<xsl:value-of select="$width * $height"/>
</xsl:template>

Gebruik:

<xsl:call-template name="calcArea">
<xsl:with-param name="width">5</xsl:with-param>
<xsl:with-param name="height" select="7"/>
</xsl:call-template>
24
Parameters - 2





Parameters kunnen ook globaal zijn voor het
hele XSLT-programma.
Dan is <xsl:param> een top-level element.
Zij zijn vergelijkbaar met een XSLT-variabelen.
Default waarde via select-attribuut of via
template content.
Voorbeelden:


<xsl:param name="naam" select="expression"/>
<xsl:param name="naam">value</xsl:param>
25
De case-clause: choose
<xsl:choose>
<xsl:when test="$format='normal'">
...
</xsl:when>
<xsl:when test="$format='alternate'">
...
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose>
26
Sorteren - 1
<xsl:sort> mag alleen voorkomen als
kind van:


<xsl:apply-templates>
<xsl:for-each>
27
Sorteren - 2
<telephone-book>
...
<entry id="44456">
<surname>Mentary</surname>
<firstname>Rudy</firstname>
<town>Simpleton</town>
<street>123 Bushwack Ln</street>
<phone>555-1234</phone>
</entry>
<entry id="44457">
<surname>Chains</surname>
<firstname>Allison</firstname>
<town>Simpleton</town>
<street>999 Leafy Rd</street>
<phone>555-4321</phone>
</entry>
...
</telephone-book>
<xsl:template match="telephonebook">
<xsl:apply-templates>
<xsl:sort select="town"/>
<xsl:sort select="surname"/>
<xsl:sort select="firstname"/>
</xsl:apply-templates>
</xsl:template>
28
Vragen?
29
Download