290 likes | 390 Views
XSLT processing & control. Datamodellering 2006. 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?
E N D
XSLT processing & control Datamodellering 2006
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
XML document tree root node <?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 element
Nodes in de XSLT-boom • Root node (= document node) • een onzichtbaar punt boven het rootelement • 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
Style sheet Stylesheet tree Result Tree Source tree Result Document Source document Transformatie proces Van boom tot boom
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 ofbuilt-inin 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">
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
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>
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.
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-templatesselect="b"/> </xsl:template> <xsl:template match="b"> Dit is een B </xsl:template> </xsl:stylesheet> <xsl:apply templates/> in combinatie met built-in rules Voorbeeld 1 output:Dit is een B Dit is een B C D
1.1 Start Debugger (in XML-Spy) let op:context = document root context
1.2 Root node Debugger gebruik van built-in rule
1.3 Node <doc> Debugger • Input-boom verder afgelopen • <doc>: geen explicit rule built-in rule
1.4 Node <a> Debugger • Komt bij <a> • Wel explicit rule maar geen output
1.5 Select <b> Debugger • Komt bij <a> • Wel explicit rule maar geen output
1.6 Node <b>B1 Debugger • Wel explicit rule voor <b> output bij B1
1.7 Node <b>B2 Debugger • Weer explicit rule voor <b> output bij B2
1.8 Andere nodes Debugger • Output result tree • Geen passende explicit rules meer
1.9 Node <c> Debugger
1.10 Node <d> Debugger
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> <xsl:for-each/> in combinatie met built-in rules Voorbeeld 2 output:Dit is B1 Dit is B2
Voorbeel 2 - trace Debugger (in oXygen) • De trace list geeft het pad weer dat de XSLT-processor heeft gevolgd • Symbolen: • enter • leave
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.
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>
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>
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>
Sorteren - 1 <xsl:sort> mag alleen voorkomen als kind van: • <xsl:apply-templates> • <xsl:for-each>
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:templatematch="telephone-book"> <xsl:apply-templates> <xsl:sortselect="town"/> <xsl:sort select="surname"/> <xsl:sort select="firstname"/> </xsl:apply-templates> </xsl:template>