Hoofdstuk 5 : XSLT 1. XSL Inleiding 2. XSLT Inleiding 3. Verwijzen naar XSLT in XML 4. XSLT document 5. XSLT elementen 6. XSLT Oefeningen 7. XSLT Data Types 8. XSLT Elementen(vervolg) 9. XSLT : XML to XML 10. XSLT In de praktijk 11. XSL-FO <p>1</p> 1. XSL : inleiding XSL : extensible Stylesheet Language. XSL = XSLT + XSL-FO + XPath XSL Transformation Language (XSLT) Omvormen van documenten XSL Formatting Objects (XSL-FO) Opmaken van documenten, formatteren voor document print-outs XML Path Language (XPath zie hoofdstuk 4) Adresseren van delen van een XML document XSL Transform XSL Formatter <p>2</p> 5. XSLT - 1
2. XSLT : Inleiding XSLT W3C standaard Verschillende versies XSLT 1.0 : 16 november 1999 XSLT 2.0 : 23 januari 2007. http://www.w3.org/tr/xslt20/ Maar nog niet in alle parsers geïmplementeerd :» Enkel de Saxon parser ondersteunt XSLT 2.0. Microsoft heeft plannen. Voor Xalan (XSLT processor in Java wereld) zijn nog geen plannen. Als je werkt aan de client side (IE, Firefox) : ondersteunen 2.0 niet.» Oxygen : Debugger XSLT Debugger, kies voor Saxon8B Maakt gebruik van Xpath als localiseringsmethode <p>3</p> Hoe werkt een transformatie? 2. XSLT - Inleiding Input XML Document (mogelijk van SAX of DOM) Mogelijke verwijzing via href XSLT Stylesheet(s) Source Tree XSLT Processor met XML Parser (built-in of externe parser) Stylesheet Tree Result Tree Output XML Document Output Text file (flat file, EDI msg, csv, SQL, JavaScript,...) Output (X)html <p>4</p> 5. XSLT - 2
2. XSLT - Inleiding Voor een transformatie heb je nodig XML document met eventueel verwijzing naar stylesheet (voor browser) XSLT Stylesheet met de transformatieregels XSLT processor voert de transformatie uit Altova XMLSPY Microsoft XML Parser(ondersteunt 1.0) http://msdn.microsoft.com/downloads/webtechnology/xml/msxml.asp Xalan: standaard XSLT processor uit de Java wereld (ondersteunt 1.0) http://www.apache.org/ Saxon: A free XSL processor, implemented in Java, from Michael Kay (2.0) http://users.iclway.co.uk/mhkay/saxon libxslt Voor meer info zie : http://www.xmlsoftware.com/ Transformatie uitvoeren kan door browsers (hebben ingebouwde parser) of via DOS prompt of vanuit een programmeertaal Aanroepen transformatie vanuit DOS command line: run-xalan boekenlijst.xml boekenlijst.xsl boekenlijst.html run-xt boekenlijst.xml boekenlijst.xsl boekenlijst.html run-saxon boekenlijst.xml boekenlijst.xsl boekenlijst.html <p>5</p> 2. XSLT - Inleiding Een eerste voorbeeld : XML + XSLT -> html <huwelijk voltrokken="1990"> <man>adam</man> <vrouw>eva</vrouw> </huwelijk> + <xsl:template match="huwelijk"> <b><xsl:value-of select="man"/></b> en <b><xsl:value-of select="vrouw"/></b> zijn getrouwd in het jaar <xsl:value-of select="@voltrokken"/>. = <b>adam</b> en <b>eva</b> zijn getrouwd in het jaar 1990. SCHEIDING TUSSEN INHOUD EN PRESENTATIE <p>6</p> 5. XSLT - 3
3. Verwijzen naar XSLT in XML Verwijzen in xml document naar XSLT. <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="boekenlijst.xsl"?> <boekenlijst> <boek isbn="123-45678-12 > <titel>het grote Office 2000 boek</titel> <auteur>helmut Vanhaegen</auteur> <auteur>helmut Kraus</auteur> <uitgever>easy Computing</uitgever> <prijs>20</prijs> </boek> <boek isbn="147-147852-36 > <titel>de beste Office 2000 geheimen</titel> <auteur>hohann-christian Hanke</auteur> <uitgever>easy Computing</uitgever> <beschrijving>tips voor...</beschrijving> <prijs>25</prijs> </boek> </boekenlijst> Verwijzen in XML document naar stylesheet (niet verplicht) <p>7</p> 4. XSLT - Document XSLT document <?xml version="1.0"?> <xsl:stylesheet version= 2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html" indent="yes"/>...... Is een well-formed XML document, dus starten met <?xml version="1.0"?> <xsl:stylesheet> => root element <xsl:output> => type uitvoer Dan volgt definitie van template(s) <xsl:template>: is een transformatieregel, die een element en een actie specifieert match attribuut bepaalt op welke nodes van de boom de template van toepassing is. De waarde is een "Xpath expressie. Tussen de tag <xsl:template> staat de transformatie. Deze kan bevatten Tekst : wordt naar de output gekopieerd XSLT instructies : worden uitgevoerd <p>8</p> 5. XSLT - 4
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version= 2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html" indent="yes"/> <html> <head> <title>boekenlijst</title> </head> <body> <xsl:apply-templates/> </body> </html> <xsl:template match="boekenlijst"> <h1>de boekenlijst</h1> <xsl:apply-templates/> Een boek <br></br> Boekenlijst0.xslt 4. XSLT - Document Werking 1.XSLT processor leest invoer document. De eerste node is de document node. Deze node wordt vergeleken met alle template regels in XSLT document. Dit komt overeen met de eerste template ( / ). De volgende info wordt weggeschreven naar output: <html><head><title>boekenlijst</title></head><body> 2. <xsl:apply-templates/> : processor selecteert alle kinderen van de huidige node en zoekt voor elk van de kinderen de overeenkomstige template op in xslt en voert deze uit. Het kind van de root is boekenlijst. Er is overeenkomst met de tweede template. <h1>de boekenlijst</h1> wordt weggeschreven. 3. <xsl:apply-templates/> selecteert de kinderen van boekenlijst en zoekt voor elk van de kinderen bijhorende template op en voert deze uit 1.Het eerste kind wordt vergeleken met de templates. Overeenkomst met de derde template. De tekst Een boek<br></br> wordt weggeschreven. 2.Idem voor 2de kind 4.De </body></html> wordt weggeschreven. <p>9</p> 4. XSLT - Document <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version= 2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html" indent="yes"/> <html> <head> <title>boekenlijst</title> </head> <body> <xsl:apply-templates/> </body> </html> <xsl:template match="boekenlijst"> <h1>de boekenlijst</h1> <xsl:apply-templates/> <xsl:value-of select="titel"/> <br/> Boekenlijst0-valueof.xslt <xsl:value-of> : processor schrijft de inhoud van de gekozen node/attribuut naar de uitvoer. select attribuut bevat een Xpath expressie. De inhoud van het opgegeven element in de XPath expressie wordt weggeschreven. In dit voorbeeld de waarde van element titel (is relatief tov de huidige node, d.i. boek) <p>10</p> 5. XSLT - 5
5. XSLT Elementen De elementen uit de XSL namespace <xsl:stylesheet version = 2.0 > root <xsl:output> Bepaalt hoe de result tree geserialiseerd wordt Bevat 4 methoden : html, text of xml(default), xhtml (enkel in XSLT 2.0) Attribuut indent="yes" : voegt indentering toe aan gegenereerd html document <xsl:template> Definieert hoe een bepaalde node getransformeerd moet worden Het match attribuut associeert de template met een node uit het xml document Match = Xpath patroon» / : betekent dat template gekoppeld wordt aan doceument node van het XML document De binnen een template opgegeven code wordt als resultaat opgeleverd wanneer de template toegepast wordt. De html tags/tekst binnen die template worden opgeleverd. Alle elementen in de namespace xsl worden verwerkt door de XSL processor. Voor het localiseren van gegevens gebruik je eveneens XPath expressie, meestal relatief tov de current content node <p>11</p> 5. XSLT - Elementen <xsl:apply-templates> Vind je altijd binnen een <xsl:template> tag. Zorgt voor de selectie van nodes en voor elk van de geselecteerde node de uitvoering van de bijhorende template. De nodes waarvoor de template wordt uitgevoerd : Zonder select (<xsl:apply-templates/>) : Selecteert alle kinderen (in document volgorde) van de huidige node en voert voor elk van de kinderen de bijhorende template uit Met select attribuut : Het select attribuut bevat een Xpath expressie. De uitvoering hiervan levert een sequentie van nodes op (0, 1 of meerdere). Voor elk van de geselecteerde nodes wordt de bijhorende template uitgevoerd. Maar wat als er voor een bepaalde node geen template bestaat? De default template wordt uitgevoerd. Opmerking : moet je niet expliciet voorzien. Deze zit in de default template <xsl:template match="* /"> (zie volgende slide) <p>12</p> 5. XSLT - 6
5. XSLT - Elementen De default templates Worden toegepast als er voor een bepaalde node geen template bestaat igv document node of element node, selecteer alle kinderen en voer voor elk van de kinderen de bijhorende template uit <xsl:template match="* /"> <xsl:apply-templates/> igv tekstnode of attribuut node output tekst. <xsl:template match="text() @*"> <xsl:value-of select="."/> igv PI of commentaar, doe niets. <xsl:template match="comment() processing-instruction()"/> Als voor een bepaalde node 2 templates bestaan, wordt de meest specifieke uitgevoerd. <xsl:template match= boek"> of <xsl:template match= boek[1]"> <p>13</p> 5. XSLT - Elementen Voorbeeld : Wat is de output van onderstaand voorbeeld? <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <html> <head><title>boekenlijst</title></head> <body> </body> </html> <xsl:value-of select="titel"/> <br/> Verandert het verwijderen van de template van boek iets aan het resultaat? Wat is er extra nodig om de template van boek uit te voeren, of dus de titel van elk boek weer te geven? Opgelet : De html moet voldoen aan de regels van well formed XML. <p>14</p> 5. XSLT - 7
5. XSLT - Elementen Voorbeeld : boekenlijst1.xsl» <xsl:apply-templates/> : Pas de template toe van alle kinderen (in document volgorde).» Er bestaan geen templates voor de kinderen, dus de default templates worden toegepast.» Merk op : attributen komen niet voor in output document. <?xml version="1.0"?> <xsl:stylesheet version= 2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <html> <head><title>boekenlijst</title></head> <body> <xsl:apply-templates/> </body> </html> Wat als je de template voor / verwijdert? <p>15</p> 5. XSLT - Elementen Wat is output van onderstaand voorbeeld? (boekenlijst2.xsl) <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <html> <head><title>boekenlijst</title></head> <body> <xsl:apply-templates select="boekenlijst/boek"/> </body> </html> <xsl:template match="titel"> <xsl:value-of select="."/><br/> <p>16</p> 5. XSLT - 8
5. XSLT - Elementen Voorbeeld 1 : overzicht van titels (boekenlijst3.xsl) <html> <body> <! herhaal voor elk boek --> <! titel komt hier --><br/> <! einde herhaling--> </body> </html> <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"/> <xsl:template match= > <html> <body> </body> </html> Wat igv <xsl:apply-templates select="boekenlijst/boek/titel"/>? <xsl:apply-templates select="titel"/>? <xsl:template match="titel">? <xsl:value-of select= "/boekenlijst/boek/titel"/>? <p>17</p> 5. XSLT - Elementen OPGELET : Paden in template zijn relatief tov de huidige context node (= match attribuut )! <xsl:value-of select= boek/titel"/><br/> <xsl:value-of select= boekenlijst/boek/titel"/><br/> <xsl:value-of select= /boekenlijst/boek/titel"/><br/> <xsl:value-of select= titel"/><br/> <p>18</p> 5. XSLT - 9
5. XSLT - Elementen Voorbeeld 2 : overzicht van titels en uitgevers (boekenlijst4.xsl) <p>19</p> <html> <body> <table border="2"> <tr> <th>titel</th> <th>uitgever</th> </tr> <! herhaal voor elk boek --> <tr> <td><! titel komt hier --></td> <td><! uitgever komt hier --></td> </tr> <! einde herhaling--> </table> </body> </html> 5. XSLT - Elementen <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"/> <html> <body> <table BORDER="2"> <tr> <th>titel</th> <th>uitgever</th> </tr> </table> </body> </html> <p>20</p> 5. XSLT - 10
5. XSLT - Elementen Voorbeeld 3 : overzicht van titels en uitgevers en auteurs <p>21</p> Oplossing 1 : <xsl:value-of> (boekenlijst4a.xsl) 5. XSLT - Elementen <tr> <td><xsl:value-of select="titel"/></td> <td><xsl:value-of select="uitgever"/></td> <td><xsl:value-of select="auteur"/></td> </tr> <xsl:value-of> - Output de waarde die in de bijbehorende XPath expressie geselecteerd wordt (Xpath expressie terug relatief tov current node.) - XPath 1.0 : Als de expressie een NodeSet zou selecteren, dan zal enkel het eerste element uit die verzameling in de output verschijnen - XPath 2.0 : Alle items uit sequence worden getoond, gescheiden door spatie (kan je opgeven in separator attribuut) vb : <x><xsl:value-of select="(1,2,3,4)" separator=" "/></x> -> Output : <x>1 2 3 4</x> Als we nu enkel de eerste waarde wensen, moeten we die expliciet selecteren!! Vraagjes : In dit voorbeeld mag je<xsl:value-of select="titel"/> vervangen door <xsl:value-of select=./titel"/>. Wat als je het zou vervangen door <xsl:value-of select= boek/titel"/>? Of door <xsl:value-of select= /boekenlijst/boek/titel"/>? <p>22</p> 5. XSLT - 11
5. XSLT - Elementen Oplossing 2: Maak een aparte template voor auteur zie boekenlijst5.xsl <tr> <td><xsl:value-of select="titel"/></td> <td><xsl:value-of select="uitgever"/></td> <td><xsl:apply-templates select="auteur"/></td> </tr> <xsl:template match="auteur"> <xsl:value-of select="."/><br/> Wens je het geheel wat mooier voor te stellen dan kan je nog een CSS toevoegen : zie boekenlijst5a.xsl <p>23</p> 5. XSLT Elementen Oplossing 3 : <xsl:for-each> (zie boekenlijst6.xsl) xsl:value-of -> selecteert de eerste waarde (XPath 1.0) xsl:for-each -> overloopt alle nodes die voldoen aan de waarde van het select attribuut Pull-processing (<-> <xsl:apply-templates> push processing) <tr> <td><xsl:value-of select="titel"/></td> <td><xsl:value-of select="uitgever"/></td> <td><xsl:for-each select="auteur"> <xsl:value-of select="."/><br/> </xsl:for-each> </td> </tr> Relatief tov de huidige context node, di auteur (en niet boek) <p>24</p> 5. XSLT - 12
6. XSLT Oefeningen Oefening 1 : Schrijf stylesheet die boekenlijst.xml converteert naar onderstaande html pagina. (Gebruik voor de titels een template, voor de auteurs werk je met een for-each) <?xml version="1.0" encoding="utf-8"?><html> <body> <h1>de titels uit de boekenkast</h1> <ul> <li>het grote Office 2000 boek</li> <li>de beste Office 2000 geheimen</li> </ul> <h1>de lijst van de auteurs</h1> <ul> <li>helmut Vanhaegen</li> <li>helmut Kraus</li> <li>hohann-christian Hanke</li> </ul> </body> </html> Oefening 2 : Wat als eenzelfde auteur meerdere maal voorkomt in XML bestand. Hoe zorg je ervoor dat hij dan maar 1 keer voorkomt in de lijst van auteurs? <p>25</p> 6. XSLT Oefeningen Oefening 3 : Welke html wordt er gegenereerd gegeven boekenlijst7.xml/xsl? <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="boekenlijst8.xsl"?> <boekenlijst> <boek isbn="123-45678-12"> <titel>het grote Office 2000 boek</titel> <auteur>helmut Vanhaegen</auteur> <auteur>helmut Kraus</auteur> <uitgever>easy Computing</uitgever> <prijs> <bedrag>21.5</bedrag> <valuta>eur</valuta> </prijs> </boek> <boek isbn="147-147852-36"> <titel>de beste Office 2000 geheimen</titel> <auteur>hohann-christian Hanke</auteur> <uitgever>easy Computing</uitgever> <prijs> <bedrag>22.5</bedrag> <valuta>eur</valuta> </prijs> </boek> </boekenlijst> <html> <head><title>boekenlijst</title></head> <body> <xsl:apply-templates/> </body> </html> <xsl:template match="boekenlijst"> <xsl:apply-templates select="boek"/> <xsl:apply-templates/> <xsl:template match="prijs"> <xsl:value-of select="bedrag"/> <p>26</p> 5. XSLT - 13
7. XSLT Data Types XSLT Schema Support Heel veel W3C XML Schema simple types zijn altijd beschikbaar Als je naar bijkomende types wenst te verwijzen dien je het schema als volgt te importeren <xsl:import-schema namespace="http://example.org/example" schema-location="/path/to/example.xsd"/> <p>27</p> 7. XSLT Data Types XSLT Types XSLT 2.0 laat toe om types te declareren voor return type van (user-declared) functions. return type van templates parameters variabelen sequenties (opgebouwd met xsl:sequence) keys Voor de declaratie van types wordt het as - attribuut gebruikt (zie verder) <p>28</p> 5. XSLT - 14
8. XSLT Elementen (vervolg) <xsl:if> Bevat de xsl-instructies, die alleen zullen worden uitgevoerd als aan de if conditie voldaan is. <xsl:if test="expressie">output</xsl:if> De Xpath expressie moet true of false opleveren. Indien true wordt de output gegenereerd Kent geen else. Voorbeeld : lijst van boeken met meer dan 1 auteur <xsl:template match="/boekenlijst/boek"> <xsl:if test="count(auteur)>1"> <xsl:value-of select="titel"/> <xsl:value-of select="uitgever"/> </xsl:if> is Unicode voor non-breaking space ( in html) Zie boekenlijst8.xsl <p>29</p> 8. XSLT Elementen (vervolg) <xsl:choose> Uitvoeren van testen met meerdere condities <xsl:choose> <xsl:when test="expressie">output</xsl:when>... <xsl:otherwise>output</xsl:otherwise> </xsl:choose> Voorbeeld : Indien prijs > 20, titel in rode, anders grijze achtergrond <xsl:template match="/boekenlijst/boek"> <tr> <xsl:choose> <xsl:when test="./prijs>20"> <td bgcolor="red"><xsl:value-of select="titel"/></td> </xsl:when> <xsl:otherwise> <td bgcolor="gray"><xsl:value-of select="titel"/></td> </xsl:otherwise> </xsl:choose> <td><xsl:value-of select="uitgever"/></td> </tr> Zie boekenlijst9.xsl <p>30</p> 5. XSLT - 15
8. XSLT Elementen (vervolg) <xsl:sort> Om elementen te sorteren binnen een <xsl:apply-templates> of <xsl:for-each>. <xsl:sort select="sorteerveld" data-type="text of number" order="ascending of descending" case-order="upper-first of lower-first"/> Je kan op meerdere velden sorteren. Per veld neem je een <xsl:sort> op Voorbeeld : sorteren van auteurs in 3de kolom tabel <xsl:template match="/boekenlijst/boek"> <tr> <td valign="top"><xsl:value-of select="titel"/></td> <td valign="top"><xsl:value-of select="uitgever"/></td> <td> <xsl:for-each select="auteur"> <xsl:sort select="."/> <xsl:value-of select="."/><br/> </xsl:for-each> </td> </tr> <td><xsl:apply-templates select="auteur"> <xsl:sort select="."/> </xsl:apply-template> </td> <p>31</p> 8. XSLT Elementen (vervolg) <xsl:variable> Definitie van constanten (write-once) Kan globaal of lokaal in een template Je geeft een naam op en zijn inhoud en (XSLT 2.0) eventueel zijn data type <xsl:variable name = naam select = expressie as= datatype /> De variabele bevat eventueel een sequentie van een opgegeven type Verwijzen naar een variabele : $naam <xsl:variable name="fp" select="1" as="xs:double"/> => is een double met de waarde 1 <xsl:variable name="date select="xs:date('2007-11-20')"/> => is een datum <xsl:variable name="date select= 2007-11-20 /> => is de string 2007-11-20. <xsl:variable name= boeken" select="/boekenlijst/boek" as = item() /> <xsl:apply-templates select ="$boeken/titel"/> <xsl:for-each select="$boeken/titel"/> <p>32</p> 5. XSLT - 16
8. XSLT Elementen (vervolg) Oefening 4 : gebruik boekenlijst2id.xml Maak een gesorteerde lijst van de boeken en gesorteerde lijst van auteurs. Wat dient hiervoor aan de oplossing van opgave 1 te worden aangepast? Plaats naast de titel ook de uitgever. <p>33</p> 8. XSLT Elementen (vervolg) <xsl:param> Doorgeven van parameters aan een named template, functie of een stylesheet Kan globaal (buiten template) of lokaal (in een template, functie) In <xsl:template> definieer je de parameters via <xsl:param>. Name attribuut bevat naam van parameter, select attribuut bevat een defaultwaarde(optioneel) In <xsl:call-templates> geef je waarden van parameters door via <xsl:withparam> <xsl:for-each select="//titel"> <xsl:call-template name="show_title"> <xsl:with-param name="file" select="." /> </xsl:call-template> </xsl:for-each> Named templates <xsl:template name="show_title" match="titel"> <xsl:param name="file" select="login.aspx" as="xs:string" /> <a href="http://www.boekshop.com?boek={$file} "><xsl:value-of select = "$file"/></a><br/> <p>34</p> Zie boekenlijst10.xsl 5. XSLT - 17
8. XSLT Elementen (vervolg) Groeperen adhv <xsl:for-each-group> select : selectie van items waarop gegroepeerd wordt (populatie) group-by : berekent een string waarde voor elke node in de populatie. Nodes met dezelfde waarde worden gegroepeerd current-group(): de leden van de huidige groep, current-grouping-key():de waarden van de huidige groep Voorbeeld : titels per auteur <xsl:for-each-group select="boekenlijst/boek" group-by="auteur"> <h2>auteur : <xsl:value-of select="current-grouping-key()"/></h2> <ul> <xsl:for-each select="current-group()"> <li><xsl:value-of select="titel" /></li> </xsl:for-each> </ul> Gemiddelde prijs : <xsl:value-of select="avg(current-group()/prijs)"/> </xsl:for-each-group> Zie boekenlijst11.xml/xsl <p>35</p> 8. XSLT Elementen (vervolg) Voeg ook verwijzing naar schema toe als je xs: gebruikt Functies : <xsl:function> (boekenlijst12.xsl) <xsl:stylesheet version="2.0" xmlns:xsl= http://www.w3.org/1999/xsl/transform xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns:foo="http://whatever"> <!-- Compare two strings ignoring case, returning same values as compare(). --> <xsl:function name="foo:compareci" as="xs:integer" > <xsl:param name="string1"/> <xsl:param name="string2"/> Definieer namespace die functie bevat Return type <xsl:value-of select="compare(upper-case($string1),upper-case($string2))"/> </xsl:function> compareci red,blue: <xsl:value-of select="foo:compareci('red','blue')"/><br/> compareci red,red: <xsl:value-of select="foo:compareci('red','red')"/><br/> compareci red,red: <xsl:value-of select="foo:compareci('red','red')"/><br/> compareci red,yellow: <xsl:value-of select="foo:compareci('red','yellow')"/><br/> Voor overige elementen uit xsl namespace zie http://www.w3.org/tr/xsl/ <p>36</p> 5. XSLT - 18
8. XSLT Elementen (vervolg) Oefening 5 (gebruik boekenlijst.xml) Geef per uitgever, de naam van de uitgever en het aantal boeken (verzorg de uitvoer: 1 boek, 2 boeken) die hij gepubliceerd heeft. Voeg nu ook een functie toe voor weergave van aantal boeken. De functie heeft als input het aantal boeken x en retourneert : Als x > 1 : x boeken anders x boek <p>37</p> 9. XSLT : XML to XML Kopiëren van nodes <xsl:copy-of> : kopieert inhoud met inbegrip van de tags <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes"/> <xsl:comment >Een auteurslijst</xsl:comment> <auteurs> <xsl:apply-templates select="boekenlijst/boek/auteur"/> </auteurs> <xsl:template match="auteur"> <xsl:copy-of select="."/> <?xml version="1.0" encoding="utf-8"?> <!--Een auteurslijst--> <auteurs> <auteur>helmut Vanhaegen</auteur> <auteur>helmut Kraus</auteur> <auteur>hohann-christian Hanke</auteur> </auteurs> <p>38</p> 5. XSLT - 19
9. XSLT : XML to XML <xsl:copy> : kopieert tag van de huidige node, maar geen kinderen of attributen of tekst <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes"/> <xsl:comment >Een boekenlijst</xsl:comment> <boekenlijst> <xsl:apply-templates select="boekenlijst/boek"/> </boekenlijst> <xsl:copy> <xsl:value-of select="titel"/> </xsl:copy> <?xml version="1.0" encoding="utf-8"?> <!--Een boekenlijst--> <boekenlijst> <boek>het grote Office 2000 boek</boek> <boek>de beste Office 2000 geheimen</boek> </boekenlijst> <p>39</p> 9. XSLT : XML to XML Voorbeelden <xsl:copy> <xsl:apply-templates/> </xsl:copy> <?xml version="1.0" encoding="utf-8"?> <!--Een boekenlijst--> <boekenlijst> <boek>het grote Office 2000 boekhelmut VanhaegenHelmut KrausEasy Computing20</boek> <boek>de beste Office 2000 geheimenhohann-christian HankeEasy ComputingTips voor alle Office programma's25</boek> </boekenlijst> <xsl:copy/> <?xml version="1.0" encoding="utf-8"?> <!--Een boekenlijst--> <boekenlijst> <boek/> <boek/> </boekenlijst> <p>40</p> 5. XSLT - 20
Creatie van nodes en attributen <xsl:element>, <xsl:attribute> 9. XSLT : XML to XML <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes"/> <xsl:comment >Een boekenlijst</xsl:comment> <xsl:element name="books"> <xsl:apply-templates select="boekenlijst/boek"/> </xsl:element> <xsl:element name="book"> </xsl:element> <xsl:attribute name="price"> <xsl:value-of select="prijs"/> </xsl:attribute> <xsl:value-of select="titel"/> <?xml version="1.0" encoding="utf-8"?> <!--Een boekenlijst--> <books> <book price="20">het grote Office 2000 boek</book> <book price="25">de beste Office 2000 geheimen</book> </books> <p>41</p> 9. XSLT : XML to XML Voorbeeld voor generatie html <email>an.janssens@hogent.be</email> An.Janssens@hogent.be Creatie van text <xsl:text>tekst</xsl:text> Creatie van een sequence <xsl:sequence> : voegt bestaande nodes of nieuwe atomic waarden toe aan een sequence <p>42</p> 5. XSLT - 21
9. XSLT XML to XML Opgave 6 Maak een boekencatalogus, gesorteerd op titel met volgende layout <?xml version="1.0" encoding="utf-8"?> <!--Boekencatalogus--> <catalogus> <boek prijs="25"> <titel>de beste Office 2000 geheimen</titel> <auteur>hohann-christian Hanke</auteur> </boek> <boek prijs="20"> <titel>het grote Office 2000 boek</titel> <auteur>helmut Vanhaegen</auteur> <auteur>helmut Kraus</auteur> </boek> </catalogus> <p>43</p> 10. XSLT - in de praktijk Waar vindt de transformatie plaats? Transformatie in browser (client-side) In XML neem je PI op voor stylesheet.!!! Als de gebruiker View Source doet ziet gebruiker volledig XML document!!!! Voorbeeld maakt gebruik van ActiveX Component van Microsoft voor de transformatie in een JavaScript. Maar XML document wordt gedownload naar client!!!! <html><body> <script type="text/javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cdcatalog.xml") // Load XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cdcatalog.xsl") // Transform document.write(xml.transformnode(xsl)) </script> </body></html> Lezen XML file adhv DOM Lezen XSL file adhv DOM <p>44</p> 5. XSLT - 22
10. XSLT - in de praktijk Transformatie in server Voorbeeld in ASP <% 'Load XML set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = false xml.load(server.mappath("cdcatalog.xml")) 'Load XSL set xsl = Server.CreateObject("Microsoft.XMLDOM") xsl.async = false xsl.load(server.mappath("cdcatalog.xsl")) 'Transform file Response.Write(xml.transformNode(xsl)) %> Of een ander tool doet de transformatie (zie XSLT processors) <p>45</p> 10. XSLT - In de praktijk Application integratie Tools BizTalk van Microsoft: http://www.microsoft.com/biztalk/ WebMethods: http://www.webmethods.com Tibco: http://www.tibco.com On the web Business Integration Journal: http://www.bijonline.com/ EAI User Group: http://www.eaiusergroup.com/ <p>46</p> 5. XSLT - 23
Overzicht Architectuur 10. XSLT - In de praktijk Application A Application B Application C HTTP SMTP Routing Services Messaging Content Based Bus Declarative Routing Application Adapter Receive Services MSMQ MQSeries Transformation Services Technology Adapter File Web Service Publish/Subscribe Business Process XML EDI Flat Custom Delivery Services Application Adapter Application D Application E Application F <p>47</p> 10. XSLT - In de praktijk XML Pipelines Piping van verschillende transformaties XML Pipeline Definition Language Version 1.0 http://www.w3.org/tr/xml-pipeline/ XProc : XML Pipelining Language (working draft) http://www.w3.org/tr/xproc/ Andere implementaties Smallx yax <p>48</p> 5. XSLT - 24
11. XSL-FO Standaard voor opmaak (XSL-FO 2.0 work started) <?xml version="1.0" encoding="utf-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/xsl/format"> <fo:layout-master-set> <fo:simple-page-master master-name="my-page"> <fo:region-body margin="1in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my-page"> <fo:flow flow-name="xsl-region-body"> <fo:block font-family="times" font-size="14pt"> Hello, world!</fo:block> </fo:flow> </fo:page-sequence> </fo:root> <p>49</p> 11. XSL-FO XSL-FO Tools Apache FOP Antenna House RenderX AltSoft Xml2PDF Intensive Designers <p>50</p> 5. XSLT - 25
On the Web Tip Internet Explorer Tools for Validating XML and Viewing XSLT Output IE past stylesheet toe en toont de output pagina. Als je op view > source klikt zie je de xml source code. Wens je de gegenereerde code te zien : http://www.microsoft.com/downloads/details.aspx?familyid=d23c1d2 C-1571-4D61-BDA8-ADF9F6849DF9&displaylang=en Dubbelklik de exe om te unzippen Rechtermuisklik op de.inf bestanden, selecteer Install in contextmenu Dan krijg je 2 extra opties als je in IE met je rechtermuis op het venster klikt met de output pagina» Validate XML» View XSL Output <p>51</p> On the web W3C recommendations XSLT 2.0 : http://www.w3.org/tr/xslt20/ XPath 2.0 specificatie : http://www.w3.org/tr/xpath20/. XPath 2.0/XQuery data model (XDM): http://www.w3.org/tr/xpathdatamodel/. Xpath 2.0/Xquery functies en operatoren : http://www.w3.org/tr/xquery-operators/. XPath 2.0/XQuery Formal semantics (XPath semantiek, belangrijk voor implementoren) : http://www.w3.org/tr/xquery-semantics/. XSLT tutorial : http://www.w3schools.com/xsl/default.asp http://www.xml.com/ http://www.xslt.com/ http://www.zvon.org/o_html/group_xsl.html <p>52</p> 5. XSLT - 26