XSLT processing & control
description
Transcript of XSLT processing & control
1
XSLT processing & control
Datamodellering 2006
2
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
3
XML document tree<?xml version="1.0"?><!-- 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 elemen
t
root node
4
Nodes in de XSLT-boom Root node (= document node)
een onzichtbaar punt boven het root element Element
correspondeert met element in XML document Attribute
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 de tekstuele inhoud van het document
Comment Processing instruction Namespace
5
Van boom tot boom
Source tree
Source document
Result Document
Result Tree
Stylesheet tree
Stylesheet
Transformatie proces
6
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">
7
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
8
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>
9
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.
10
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>
XSLT<?xml version="1.0" encoding="UTF-
8"?><xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/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>
<xsl:apply templates/>in combinatie met
built-in rules
output:Dit is een BDit is een BC D
11
1.1 Start
context
let op:context = document root
Debugger (in XML-Spy)
12
1.2 Root node
gebruik van built-in rule
Debugger
13
1.3 Node <doc>
• Input-boom verder afgelopen• <doc>: geen explicit rule built-in rule
Debugger
14
1.4 Node <a>
• Komt bij <a>• Wel explicit rule maar geen output
Debugger
15
1.5 Select <b>
• Komt bij <a>• Wel explicit rule maar geen output
Debugger
16
1.6 Node <b>B1
• Wel explicit rule voor <b> output bij B1
Debugger
17
1.7 Node <b>B2
• Weer explicit rule voor <b> output bij B2
Debugger
18
1.8 Andere nodes
• Output result tree• Geen passende explicit rules meer
Debugger
19
1.9 Node <c> Debugger
20
1.10 Node <d> Debugger
21
Voorbeeld 2<xsl:for-each/>
in combinatie met built-in rules
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>
XSLT<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/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>
output: Dit is B1Dit is B2
22
Voorbeel 2 - trace De trace list geeft
het pad weer dat de XSLT-processor heeft gevolgd
Symbolen: enter leave
Debugger (in oXygen)
23
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.
24
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>
25
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>
26
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>
27
Sorteren - 1<xsl:sort> mag alleen voorkomen
als kind van: <xsl:apply-templates> <xsl:for-each>
28
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="telephone-book"><xsl:apply-templates> <xsl:sort select="town"/> <xsl:sort select="surname"/> <xsl:sort select="firstname"/></xsl:apply-templates></xsl:template>
29
Vragen?