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