Marco Ronchetti - [email protected] “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento J0 1 XSL – Basic elements “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] The process J0 2 •The process starts by traversing the document tree, attempting to find a single matching rule for each visited node. •Once the rule is found, the body of the rule is istantiated •Further processing is specified with the <xsl:applytemplates>. The nodes to process are specified in the match attribute. If the attribute is omitted, it continues with the next element that it has a matching template. “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Implicit rules J0 3 <template match=“/|*”> <apply-templates/> </template> <template match=“text()”> <value-of select=“.”/> </template> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Selective processing J0 4 <template match=“group”> <apply-templates select=“name”> </template> <template match=“intro”> <apply-templates select=“//chapter/title”> </template> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Selective processing - example J0 5 <?xml version="1.0"?> <?xml-stylesheet href="IgnoraParte4.xsl" type="text/xsl" ?> <ROOT> <SECRET> SEZIONE RISERVATA: <TAG1>Testo Privato</TAG1> </SECRET> <PUBLIC> SEZIONE PUBBLICA <TAG1>Testo Pubblico</TAG1> </PUBLIC> </ROOT> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Selective processing - example J0 6 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:template match="SECRET">Esiste una parte privata</xsl:template> <xsl:template match="PUBLIC">Esiste una parte pubblica</xsl:template> <xsl:template match="PUBLIC">La parte pubblica contiene:<xsl:applytemplates/></xsl:template> </xsl:stylesheet> OUTPUT <?xml version="1.0" encoding="UTF-8"?> Esiste una parte privata La parte pubblica contiene: SEZIONE PUBBLICA Testo Pubblico “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Pattern Matching - nodes Marco Ronchetti - [email protected] / matches the root node J0 7 A matches any <A> element * matches any element A|B matches any <A> or <B> element A/B matches any <B> element within a <A> element A//B matches any <B> element with a <A> ancestor text() matches any text node “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Pattern Matching J0 8 id(“pippo”) matches the element with unique ID pippo A[1] matches any <A> element that is the first <A> child of its parent A[last()=1] matches any <A> element that is the last <A> child of its parent B/A[position() mod 2 = 1] matches any <A> element that is an odd-numbered <A> child of its B parent “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Pattern Matching - attributes J0 9 @A matches any A attribute @* matches any attribute B[@A=“v”]//C matches any <C> element that has a <B> ancestor with a A attribute with v value processing-instruction() node() “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Imports, priorities and spaces J0 10 IMPORT <import href=“…”> PRIORITIES <template match=“…” priority=“2” > (default 1) A parita’ di priorita’ vince l’ultima definizione STRIPPING SPACES <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:strip-space elements="*"/> ... </xsl:stylesheet> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Variables, templates and parameters J0 11 <variable name=“colore”>rosso</variable> … Il colore e’: <xsl:value-of select=“$colore”>. <template name=“header”> Sequenza di testo e tags </template> … <call-template name=“header”/> Once a value has been assigned to a variable, it cannot be changed <template name=“header”><param name=“P”>default</param> Sequenza di testo e tags, inclusa <value-of select=“$P”/> </template> … <call-template name=“header”> <with-param name=“P”>3</with-param></call-template> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] conditions J0 12 < xsl: if test”position() mod 2 =0”> <B><apply_templates/></B> </ xsl: if> <xsl:choose> <xsl: when test”position() mod 2 =0”> <B><apply_templates/></B> </xsl: when> <xsl: otherwise> <I><apply_templates/></I> </xsl: otherwise > </xsl: choose > “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] for-each J0 13 <xsl:for-each select=“expression”> some rule </xsl:for-each> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Sorting J0 14 <list> <item sortcode=“C”> Pluto</item> <item sortcode=“A”> Topolino </item> <item sortcode=“B”>Pippo</item> </list> <template match=“list”> <apply-templates><sort/></apply-templates> </template> <template match=“list”> <apply-templates> <sort select=“@sortcode” order=descending/> </apply-templates> </template> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Numbering J0 15 <list> <item sortcode=“C”> Pluto</item> <item sortcode=“A”> Topolino </item> <item sortcode=“B”>Pippo</item> </list> <template match=“item”> <apply-templates><number format=“A”/></applytemplates> </template> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] Numbering J0 16 <chapter> <section> <title> First section of chapter 1</title> … <template match=“section/title”> <number level=“multi” format=“1.A”/ count=chapter|section/> </template> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! - Esempio1 XML J0 17 <?xml version="1.0"?> <?xml-stylesheet href="try.xsl" type="text/xsl"?> <department><deptname>Telecomunicazioni</deptname> <group id="gr1"> <emp><nome>Mario Rossi</nome><livello>7</livello></emp> <emp><nome>Giuseppe Verdi</nome><livello>6</livello></emp> </group> <group id="gr2"> <emp><nome>Filippo Neri</nome><livello>5</livello></emp> <emp><nome>Mauro Bianchi</nome><livello>6</livello></emp> </group> </department> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! - Esempio1 XSL a J0 18 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="department"> <xsl:value-of select="deptname"/> --- Lista degli impiegati: <xsl:for-each select="//nome" ><xsl:value-of select="position()"/> (<xsl:value-of select="."/>) </xsl:for-each> <xsl:apply-templates/> </xsl:template> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! - Esempio1 XSL b J0 19 <xsl:template match="nome">Qui lavora <xsl:applytemplates/></xsl:template> <xsl:template match="livello"> con qualifica di <xsl:value-of select="."/> livello.</xsl:template> </xsl:stylesheet> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! - Esempio1 OUT J0 20 <?xml version="1.0" encoding="UTF-8"?> Telecomunicazioni --- Lista degli impiegati: 1(Mario Rossi) 2(Giuseppe Verdi) 3(Filippo Neri) 4(Mauro Bianchi) ==== GRUPPO gr1 ==== Qui lavora Mario Rossi con qualifica di 7 livello. Qui lavora Giuseppe Verdi con qualifica di 6 livello. -----------------------------------------==== GRUPPO gr2 ==== Qui lavora Filippo Neri con qualifica di 5 livello. Qui lavora Mauro Bianchi con qualifica di 6 livello. “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! – Esempio2 XML a J0 21 <?xml version="1.0" ?><!--prod.xml--> <!DOCTYPE sales [ <!ELEMENT sales ( products, record )><!--sales info--> <!ELEMENT products ( product+ )><!--product record--> <!ELEMENT product ( #PCDATA )><!--product information--> <!ATTLIST product id ID #REQUIRED> <!ELEMENT record ( cust+ )> <!--sales record--> <!ELEMENT cust ( prodsale+ )> <!--customer sales record--> <!ATTLIST cust num CDATA #REQUIRED><!--customer number--> <!ELEMENT prodsale ( #PCDATA )><!--product sale record--> <!ATTLIST prodsale idref IDREF #REQUIRED> ]> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! – Esempio2 XML b J0 22 <sales> <products><product id="p1">Packing Boxes</product> <product id="p2">Packing Tape</product></products> <record><cust num="C001"> <prodsale idref="p1">10</prodsale> <prodsale idref="p2">110</prodsale></cust> <cust num="C002"> <prodsale idref="p2">10</prodsale></cust> <cust num="C003"> <prodsale idref="p1">75</prodsale> <prodsale idref="p2">35</prodsale></cust></record> </sales> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! – Esempio2 XSL a J0 23 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:template match="sales"> <html> <head><title>Product Sales Summary</title></head> <body bgcolor="#ffffff"><h2>Product Sales Summary</h2> <table summary="Product Sales Summary" border="1"> <th align="center"> <xsl:for-each select="//product"> <td><b><xsl:value-of select="."/></b></td> </xsl:for-each></th> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! – Esempio2 XSL b J0 24 <xsl:for-each select="/sales/record/cust"> <xsl:variable name="customer" select="."/> <tr align="right"><td><xsl:value-of select="@num"/></td> <xsl:for-each select="//product"> <td><xsl:value-of select="$customer/prodsale [@idref=current()/@id]"/> </td></xsl:for-each> </tr></xsl:for-each> <tr align="right"><td><b>Totals:</b></td> <xsl:for-each select="//product"> <xsl:variable name="pid" select="@id"/> <td><i><xsl:value-of select="sum(//prodsale[@idref=$pid])"/></i> </td></xsl:for-each></tr> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! – Esempio2 XSL c J0 25 </table> </body></html> </xsl:template> </xsl:stylesheet> “Basi di Dati Web e Distribuite” – Laurea Specialistica in Informatica – Università di Trento Marco Ronchetti - [email protected] HANDS ON! – Esempio2 OUT J0 26