320 likes | 436 Views
Extensible Markup Language. XSLT transzformációk. Hernyák Zoltán http://aries.ektf.hu/~hz hz@aries.ektf.hu. XML - XSLT. Extensible Style Sheet Language Transformation XSLT Ez egy ”programozási nyelv” XML-ben van a forráskód feldolgoz egy XML filet
E N D
Extensible Markup Language XSLT transzformációk Hernyák Zoltán http://aries.ektf.hu/~hz hz@aries.ektf.hu
XML - XSLT Extensible Style Sheet Language Transformation XSLT Ez egy ”programozási nyelv” XML-ben van a forráskód feldolgoz egy XML filet eredménye egy újabb HTML, CSS, XLS, XML file
XML - XSLT • Kell egy „futtató” program hozzá (xslt feldolgozó) • Xalan (Java alapú) http://www.apache.org • Saxon (C# alapú) http://saxon.sourceforge.net/ transform.exe-xsl:person_templ.xls-s:person.xml -s:<forrás> az adatokat tartalmató xml file -xsl:<program> az xslt transzformációs program A program ”outputja” a transzformáció eredménye
XML névterek Az XML elemeket névterekbe lehet rakni Több XML esetén az azonos nevű elemeket így lehet egymástól elkülöníteni Egy XML-en belül is hasznos, ha azonos nevű elemeknek más-más lehetséges tartalmi leírást adunk Első lépés: definiálni kell a névteret Második lépés: használni kell a névteret <java xmlns:java=”http://www.sun.com/java” xmlns:delphi=”http://www.borland.com/delphi”> …. <delphi:integer name=”a” value=”12” /> <java:integer name=”x” value=”34” /> </java>
XML - XSLT <people> <person> <name>Jane Doe</name> <pet>Fluffy</pet> </person> </people> <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="person"> I found a person element! </xsl:template> </xsl:stylesheet> Az XSLT processor az xls névtér elemeit dolgozza fel
XML - XSLT <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> …. </xsl:stylesheet> Az XSLT file ezzel kezdődik Innen ismeri majd fel a feldolgozó program mire számítson
XML - XSLT <xsl:template match="person"> I found a person element! </xsl:template> Egy vagy több template van benne Egy ilyen template tartalma kiíródik, ha az XML file beolvasása közben egyezést talál a feldolgozó Template-k nem egymásba ágyazhatóak!
XML - XSLT <people> <person> <name>Jane Doe</name> <pet>Fluffy</pet> </person> </people> Ebben a formában az apply-templates kiírja a tag-ekhez tartozó értékeket <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="person"> ---- person ----- <xsl:apply-templates /> </xsl:template> </xsl:stylesheet>
XML - XSLT <xsl:template match="person"> -- A Person -- <xsl:apply-templates /> </xsl:template> <xsl:template match="name"> Name: <xsl:apply-templates /> </xsl:template> <xsl:template match="pet"> Pet: <xsl:apply-templates /> </xsl:template>
XML - XSLT <?xml version="1.0"?> <xsl:stylesheet … > <xsl:output method=”text” /> <xsl:strip-space elements=”name pet” /> … </xsl:stylesheet> Output-method = text -> nem írja ki az xml fejlécet Output-method = html ->html kimenetet produkál Output-method = xml -> XML kimenetet produkál strip-space: a felsorolt elemek között eltávolítja a white-space-eket preserve-space: … megtartja a white space-eket (def.)
XML - XSLT Készítsünk ilyet!
XML - XSLT Meg kell írni a template-t az elemekre
XML - XSLT Az apply-templates feldolgozza a közbeeső elemeket <body> … </body> -t ki lehet írni XHTML kötelező (a tag-eket le is kell zárni!)
XML - XSLT HTML tagokat tudunk beépíteni az outputba a megfelelő helyre
XML - XPATH Leíró technika, elemeket azonosít egy XML-en belül A gyökér elemet / jel szimbolizálja /people/person/name - minden „name” elemet kiválaszt a /people/person-n belül
XML – XPATH szabályok nodename - minden elem kiválasztása, akinek a szülője az adott nevű node / - kiindulás a gyökérelemből // - kiválasztja az aktuális elemből kiinduló minden elemet, bármely mélységbe . aktuális elem kiválasztása .. szülő elem kiválasztása @ attribútum-kiválasztás
XML - XPATH person - minden elem kiválasztása, akinek a szülője „person” /people/person/name - minden „name” elemet kiválaszt a /people/person-n belül person//name - minden name kiválasztása, akinek a szülője „person” //name - minden „name” elemet kiválaszt az XML-en belül //pet/@breed - a pet elemek breed attribútumai //@* - minden attribútumot kiválaszt //@species - minden species attribútumot kiválaszt
XML - XPATH Mivel gyakori, hogy egy Xpath útvonal több elemet is kiválaszt, de ezekből csak egy kell – prédikátumok kellenek a további azonosításhoz… //person[1] - az első találat //person[last()] - utolsó találat //person[last()-1] - utolsó előtti találat //pet[.=‘Fluffy’] . szimbolizálja az aktuális elemet kiválasztja azokat az elemeket, amelyeknek az értéke ‘Fluffy’ //pet[.=‘Fluffy’]/.. kiválasztja a szülő elemét, a ‘Fluffy’ értékű node-nak //name[contains(.,’Jane’)] minden „name” elemet, amelyben szerepel „Jane”
XML - XPATH //pet[@breed] - az összes pet elem, amelynek van breed attr-a //pet[@breed=‘collie’] - az összes pet elem, amelynek van breed-ke amelynek értéke „collie” //pet[@breed=‘collie’]/.. a szülő elemek, amelyeknek van collie breed-jük //pet[@species=‘cat’] | //pet[@species=’dog’] az elemek melyek vagy cat-ok vagy dog-ok
XML - XSLT <xsl:template match=”/people/person"> --- PEOPLE – <xsl:apply-templates /> </xsl:template> A match is egy XPATH leírás Ezen találat csak a fenti útvonalon talált person-okra illeszkedik rá <xsl:template match=”/"> <html> <body> <xls:apply-templates /> </body> </html> </xsl:template> Gyökér elemre illeszkedő template
XML - XSLT <xsl:template match=”//name[@address]"> Name: <xsl:apply-templates /> (with address) </xsl:template> <xsl:template match=”name"> Name: <xsl:apply-templates /> </xsl:template> Ha van neki „address” property-je, akkor felső szabály szerint íródik ki, Ha nincs neki, akkor az alsó A sorrend nem számít az xsl-en belül
XML - XSLT <xsl:template match=”//name[@address]"> Name: <xsl:apply-templates /> (with address) </xsl:template> <xsl:template match=”name"> Name: <xsl:apply-templates /> </xsl:template> Ha van neki „address” property-je, akkor felső szabály szerint íródik ki, Ha nincs neki, akkor az alsó A sorrend nem számít az xsl-en belül
XML – XSLTtengelyek ancestor minden ős (felfelé rekúrzívan) ancestor-or-self saját maga és minden őse attribute az aktuális node összes attribútuma child az aktuális node összes gyerek node-ja descendant minden gyerek node (lefelé rekúrzívan)
XML – XSLTtengelyek following az aktuális node bezáró tagja után _minden_ following-sibling az akt.node után következő minden testvér namespace az akt.node minden névtér node -ja parent az őse az akt.node-nak preceding a megelőző tartalom (akt.node előtti tartalom) preceding-sibling node előtti összes testvér self saját maga
XML – XSLTtengelyek child::book minden „book” ami gyerekeleme az akt.node-nak child::* az akt.node minden gyerekeleme descendant::book az akt.node alatt bárhol szereplő „book”-k ancestor::book felettünk bárhol szereplő „book”-k child::*/child::price 2 szinttel alattunk lévő „price” elemek //pet[@breed=’calico’]/parent::* minden pet element, amelynek van „breed” attribútuma, amely „calico” értékű
XML - XSLT Elem értékének lekérése: value-of Az aktuális node alatti gyerek elemek közül a name értéke <xsl:value-ofselect=”name” /> Az aktuális node „breed” attribútumának értéke <xsl:value-ofselect=”@breed” />
XML - XSLT XSLT transzformációban alkalmazni a value-of -t <xsl:templatematch="pet"> <b>Pet: </b> <xsl:apply-templates /><br /> Species: <xsl:value-of select="@species" /><br /> Breed: <xsl:value-of select="@breed" /><br /> </xsl:template>
XML - XSLT @* minden attribútum kiválasztása name() megadja az attribútum nevét <xsl:templatematch="@*"> <xsl:value-ofselect="name()" /> : <xsl:value-ofselect="." /><br /> </xsl:template>
XML - XSLT Feltételes output készítése <xsl:iftest=”… kifejezés …” /> … szöveg kiiírás … </xls:if> <xsl:iftest=”@species=‘cat’” /> <imgsrc=”cat.gif” /><br> </xls:if>
XML - XSLT Feltételes output készítése <xsl:iftest=”@species=‘cat’” /> <imgsrc=”cat.gif” /><br> </xls:if>
XML - XSLT Készítsünk el egy DVD nyilvántartó XML filet. Egy DVD-t jellemez a címe, kiadás éve, ára. A DVD kategóriáját adjuk meg attribútum formájában (akció|zene|rajzfilm). Ezen XML file alapján készítsünk el egy HTML outputot, ahol a DVD címe legyen pirossal írva, ha az akciófilm, egy DVD film információi egy sorba kerüljenek. Készítsünk el egy CSV kimenetet is, vesszővel tagolt text file, melyet Excelben be lehet olvasni.