XSLT 1 David Massey MBIB4140 12-9-2017
Structured information toolkit "XML's new playmates include stylesheets for display and transformation, strong methods for linking resources, tools for data manipulation and querying, error checking and structure enforcement tools, and a plethora of development environments. As a result of these applications, XML is assured a long and fruitful career as the structured information toolkit of choice." Ray, Learning XML, 2003, s. xi
XSLT "XSLT, the Extensible Stylesheet Language for Transformation, is an official recommendation of the World Wide Web Consortium (W3C). It provides a flexible, powerful language for transforming XML documents into something else, such as an HTML document, another XML document, a Portable Document Format (PDF) file, [...] a flat text file, a JPEG file, or most anything you want. You write an XSLT stylesheet to define the rules for tansforming an XML document, and the XSLT processor does the work." Tidwell, XSLT, 2008, s. 1
XML XSLT XSLT prosessor Result
Arbeidsflyt 1. Lag eller finn et XML-dokument som skal prosesseres 2. Lag et XSLT-stilark 3. Knytt XSLT-stilarket til XML-dokumentet 4. Kjør transformasjonen
XML eksempel <?xml version="1.0" encoding="utf-8"?> <books> <book number="b1"> <title>how to Build a Digital Library</title> <authors> <author> <first_name>ian H.</first_name> <family_name>witten</family_name> </author> <author> <first_name>david</first_name> <family_name>bainbridge</family_name> </author> </authors> <year>2003</year> <publisher>morgan Kaufmann Publishers</publisher> <isbn>1-55860-790-0</isbn> </book>
XML eksempel, forts. <book number="b2"> <title>understanding Digital Libraries</title> <edition>2</edition> <authors> <author> <first_name>michael</first_name> <family_name>lesk</family_name> </author> </authors> <year>2005</year> <publisher>morgan Kaufmann Publishers</publisher> <isbn>1-55860-924-5</isbn> </book> </books>
Illustrasjon: Tor Arne Dahl
Prøv selv Last ned books.xml fra: http://edu.hioa.no/mbib4140/h17/ressurser/ xml/ Åpne books.xml i XML Copy Editor Opprett et nytt XSLT (XSL Stylesheet (*.xsl) fra listen Lagre XSLTen som books.xsl
Prøv selv Åpne books.xml og kobler den til books.xsl med XML > Associate > XSLT Stylesheet En ny linje legges til XML-dokumentet som vil ligne dette:
Prøv selv Ha books.xml åpent Kjør XSL transformasjon: XML > XSL Transform... F8 Resultatet vises i et nytt dokumentfanekort
Traversing Vi begynner fra rotnoden (/) Vi traverserer en node om gangen og det er alltid kun en gjeldende node
<xsl:template match="/"> Hva i input-dokumentet skal behandles? Mønstergjenkjenning Angi i match-attributtet Bruk XPath syntaks / matcher rotnoden <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/"> </xsl:template> </xsl:stylesheet>
<xsl:value-of /> Hva skal skrives ut? Angi i verdien til select-attributtet Relativt til gjeldende node / books book book title title <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/"> <xsl:value-of select="books/book/title" /> </xsl:template> </xsl:stylesheet>
Prøv selv Oppdater books.xsl Legg til <xsl:value-of select="books/book/title" /> på riktig sted Husk å lagre books.xsl Kjør prosesseringen: XML > XSL Transform... (eller F8) Endre select slik at stilarket skriver ut family_name
XPath navigering select="." gjeldende node select="/" rotnoden select="books" relativt sti select="/books" absolutt sti select="books/book/authors/author/family_name" select="books//family_name"
<xsl:for-each> Brukes for å traversere et bestemt sett av noder. F.eks. alle bøkene i XML dokumentet. <xsl:template match="/"> <xsl:for-each select="books/book"> <xsl:value-of select="title" /> </xsl:for-each> </xsl:template> / books book book title title
<xsl:template match="/"> <xsl:for-each select="books/book"> <xsl:value-of select="title" /> </xsl:for-each> </xsl:template> / books book book title title <xsl:template match="/"> <xsl:for-each select="books/book"> <xsl:value-of select="title" /> </xsl:for-each> </xsl:template> / books book book title title <xsl:template match="/"> <xsl:for-each select="books/book"> <xsl:value-of select="title" /> </xsl:for-each> </xsl:template> / books book book title title
Prøv selv Endre XSLTen slik at det skriver ut titlene fra XML dokumentet Endre XSLTen slik at etternavn av forfatterne skrives ut istedenfor titlene Endre XSLTen slik at både fornavn og etternavn av forfatterne skrives ut
<xsl:text> Legg til tekst <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/"> <xsl:for-each select="books/book/authors/author"> <xsl:value-of select="first_name" /><xsl:text> </xsl:text> <xsl:value-of select="family_name" /> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Prøv selv Bruk <xsl:text> for å forbedre resultatet som produseres av books.xsl Endre books.xsl slik at stilarket produserer følgende resultat: Fornavn: Ian H. Etternavn: Witten Fornavn: David Etternavn: Bainbridge Fornavn: Michael Etternavn: Lesk
XML til XML XSLT transformasjon XML XML resultat <?xml version="1.0" encoding="utf-8"?> <books> <book number="b1"> <title>how to Build a Digital Library</title> <authors> <author> <first_name>ian H.</first_name> <family_name>witten</family_name> </author> <author> <first_name>david</first_name> <family_name>bainbridge</family_name> </author> </authors> <year>2003</year> <publisher>morgan Kaufmann Publishers</publisher> <isbn>1-55860-790-0</isbn> </book> <?xml version="1.0" encoding="utf-8"?> <forfattere> <forfatter> <fornavn>david</fornavn> <etternavn>bainbridge</etternavn> </forfatter> <forfatter> <fornavn>michael</fornavn> <etternavn>lesk</etternavn> </forfatter> </forfattere>
Legg til markup <xsl:template match="/"> <forfattere> <xsl:for-each select="books/book/authors/author"> <forfatter> <fornavn><xsl:value-of select="first_name" /></fornavn> <etternavn><xsl:value-of select="family_name" /></etternavn> </forfatter> </xsl:for-each> </forfattere> </xsl:template>
Prøv selv Opprett et nytt XSLT-stilark, books2.xsl Legg til endringene fra forrige lysark Endre koblingen i books.xml slik at books2.xsl brukes for transformasjonen Prosesser XML-dokumentet Endre XSLT-stilarket slik at titler skrives ut istedenfor forfatterne. Husk å endre markupen
Aaagh Hvis du får denne feilmedling når du forsøke å prosessere XMLdokumentet kan en restart av XML Copy Editor løser problemet.
<xsl:sort /> <xsl:template match="/"> <forfattere> <xsl:for-each select="books/book/authors/author"> <xsl:sort select="family_name" /> <forfatter> <fornavn><xsl:value-of select="first_name" /></fornavn> <etternavn><xsl:value-of select="family_name" /></etternavn> </forfatter> </xsl:for-each> </forfattere> </xsl:template>
Prøv selv Bruk xsl:sort for å endre rekkefølgen på titlene slik at de sorteres etter utgivelsesdato. Attributtet order kan brukes for å bestemme rekkefølgen. Verdiene er enten ascending eller descending. Prøv begge
XML til XML XSLT prossessering XML XML resultat <?xml version="1.0" encoding="utf-8"?> <books> <book number="b1"> <title>how to Build a Digital Library</title> <authors> <author> <first_name>ian H.</first_name> <family_name>witten</family_name> </author> <author> <first_name>david</first_name> <family_name>bainbridge</family_name> </author> </authors> <year>2003</year> <publisher>morgan Kaufmann Publishers</publisher> <isbn>1-55860-790-0</isbn> </book> <?xml version="1.0" encoding="utf-8"?> <bøker> <bok> <tittel>understanding Digital Libraries</tittel> <år>2005</år> </bok> </bøker>
<xsl: if> <xsl:template match="/"> <bøker> <xsl:for-each select="books/book"> <xsl:sort select="year" order="descending" /> <xsl:if test="contains(authors/author/family_name, 'Lesk')"> <bok> <tittel><xsl:value-of select="title" /></tittel> <år><xsl:value-of select="year" /></år> </bok> </xsl:if> </xsl:for-each> </bøker> </xsl:template>
Prøv selv Prøv eksempelet fra forrige lysarket Endre stilarket slik at kun bøker skrevet etter 2003 kommer med i resultatet. Tips: <xsl:if test="year > 2003">
<xsl:choose> <xsl:template match="/"> <bøker> <xsl:for-each select="books/book"> <bok> <tittel><xsl:value-of select="title" /></tittel> <xsl:choose> <xsl:when test="year > 2004"> <alder><xsl:text>nytt!</xsl:text></alder> </xsl:when> <xsl:otherwise> <alder><xsl:text>gammelt!</xsl:text></alder> </xsl:otherwise> </xsl:choose> <år><xsl:value-of select="year" /></år> </bok> </xsl:for-each> </bøker> </xsl:template>
Prøv selv Endre books2.xsl fra if til choose, when og otherwise
Saxon Windows på HiOA: Transfom er navnet på programmet -s: hvilken XML-dokument? -o: hvor skal resultatet lagres? -xsl: hvilken XSLT-stilatk?
Prøv selv Lag html.xls som prosesserer books.xml og lager output som HTML Siden skal inneholder en overskrift (h1) og en tabell (table) Relevant tags er: html, head, title, h1, table, tr, th og td Tabellen skal bestå av tre kolonner: tittel, utgivelsesår og ISBN Mer info: https://www.w3schools.com/html/html_tables.asp Strukturen vises på neste lysark Fjern XML-deklarasjonen fra første linjen. Lagre resultatet som books.html og klikk på globusen for å se resultatet i en nettleser Forts.
Prøv selv Fjern: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <html> </html> <head> </head> <body> </body> <title>bøker</title> <h1>bøker</h1> <table> <tr> </table> </tr> <tr> </tr> <td>how to Build a Digital Library</td> <td>2003</td> <td>1-55860-790-0</td> <td>understanding Digital Libraries</td> <td>2005</td> <td>1-55860-924-5</td> Legg gjerne til overskrifter på kolonnene! Da brukes th istedenfor td
Prøv selv I denne oppgaven skal et XML-dokument gjøres om til JSON som deretter brukes for å markere steder på et kart Hent XML-dokumentet mondial-europe-small.xml fra: http://edu.hioa.no/mbib4140/h17/ressurser/xml/ Hent XSLT-stilarket mondial.xsl fra: http://edu.hioa.no/mbib4140/h17/ressurser/xslt/ Forts.
mondial-europe-small.xml <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="..\xslt\mondial.xsl"?> <mondial> <country car_code="al" area="28750" capital="cty-albania-tirane" memberships="org-bsec "> <name>albania</name> <population measured="est." year="1950">1214489</population> <population measured="est." year="1960">1618829</population> <population measured="est." year="1970">2138966</population> <population measured="est." year="1980">2734776</population> <population measured="est." year="1990">3446882</population> <population year="1997">3249136</population> <population measured="est." year="2000">3304948</population> <population year="2001" measured="census">3069275</population> <population year="2011" measured="census">2800138</population> <population_growth>0.3</population_growth> <infant_mortality>13.19</infant_mortality> <gdp_total>12800</gdp_total> <gdp_agri>19.5</gdp_agri> <gdp_ind>12</gdp_ind> <gdp_serv>68.5</gdp_serv> <inflation>1.7</inflation> <unemployment>16.9</unemployment>... Første 1,000 linjer fra: https://www.dbis.informatik.unigoettingen.de/mondial/mondial-europe.xml Forts.
Output JSON { "type": "FeatureCollection", "features": [{ "type":"feature", "geometry": { "type":"point", "coordinates": [19.82, 41.33] }, "properties": { "name": "Tirana" } },{ "type":"feature", "geometry": { "type":"point", "coordinates": [19.5, 42.07] },... },]} Forts.
mondial.xsl <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/"> <xsl:text>{ "type": "FeatureCollection", "features": [</xsl:text> <xsl:for-each select="fyll inn"> <xsl:text>{ "type":"feature", "geometry": { "type":"point", "coordinates": [</xsl:text> <xsl:value-of select="fyll inn" /> <xsl:text>, </xsl:text> <xsl:value-of select="fyll inn" /> <xsl:text>] </xsl:text> <xsl:text>}, "properties": { "name": "</xsl:text> <xsl:value-of select="fyll inn" /> <xsl:text>" } },</xsl:text> </xsl:for-each> <xsl:text>] }</xsl:text> </xsl:template> </xsl:stylesheet> 1. Oppdater mondial.xsl med riktig XPathadresser for å produsere JSON output fra forrige lysark 2. Kobler XSLT-stilarket til XML-dokumentet 3. Kjør transformasjonen Forts.
Åpner: http://geojson.io 1. Fjern JSON som vist 2. Kopiere output som er produsert av XSLT-transformasjonen. Ikke ta med XML-deklarasjonen i første linje 3. Etter du limer inn din JSON: fjern ekstra komma i siste linje
Neste gang NB torsdag 21. september Mer XSLT