XSLT processing & control

Preview:

DESCRIPTION

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? - PowerPoint PPT Presentation

Citation preview

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?

Recommended