Fejlett Programozási Technikák 2. 15/2
A mai előadás tartalma: DTD XSD XPath XSLT
Irodalom Don Box: Essential XML http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnxml/html/desxsdlib.asp http://www.w3.org/TR/xmlschema-2/#built-in-datatypes http://www.zvon.org/xxl/XSLTutorial/Books/Book1/
Aktuális a téma? Microsoft: Az XML alapú technológiák adnak lehetőséget a komponensek együttműködésére. Oracle: Az OTN magazin több mint 1/3-ad része webes technológiákkal foglalkozik. Integráció
DTD Öndokumentálás Nyelvtan Elemkészlet Hibadetektálás (B2B)
Példa <!ELEMENT Pelda1:Feladat (Pelda1:vegrehajto, Pelda1:megbizo, Pelda1:hatarido)> <!ELEMENT Pelda1:vegrehajto (#PCDATA)> <!ELEMENT Pelda1:megbizo (#PCDATA)> <!ELEMENT Pelda1:hatarido (#PCDATA)>
Ismétlődés operátorok Nincs Pontosan egyszer kell szerepelnie ? Egyszer vagy egyszer sem + Legalább egyszer * Akárhányszor (0 is) <!ELEMENT Pelda1:Feladat ((Pelda1:vegrehajto, Pelda1:hatarido))+, Pelda1:megbizo)>
Tulajdonságok <!ATTLIST feladat munkahely (irinyi|arpadter)> Módosító: #IMPLIED -- Nem feltétlenül szükséges. #REQUIRED -- Szükséges. #FIXED -- Kötelező a jelenléte és az értéke egyaránt. ”alapértelmezett érték”
XML Schema Definition Language XML elemkészletet és nyelvtant definiál XML szintaxist használ (SAX,DOM) A legtöbb programnyelvben használt adattípusokat használhatjuk A névterek használata lehetővé teszi több séma egybeolvasztását
XSD Típusokat definiálhatunk Beépített típusokat használhatunk (http://www.w3.org/TR/xmlschema-2/) Szűkítéses származtatás Az érték határok mellett a lexikális formátum is definiált (0,1-true,false) -> kompatibilitás
Értékek, Lexikális típusok Beépített adattípusokat használhatunk
Típusok definiálása névtéren belül A felhasználók definiálhatnak típusokat(UDT) Típus definiáláskor hasonlóan az OO nyelvekhez célszerű névtereket használni
Példa <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.org/publishing" xmlns:tns="http://example.org/publishing"> <!-- type definitions --> <xsd:simpleType name="AuthorId"> <!-- define value space details here --> </xsd:simpleType> <xsd:complexType name="AuthorType"> <!-- define structural details here --> </xsd:complexType> <!-- global element/attribute declarations --> <xsd:element name="author" type="tns:AuthorType"/> <xsd:attribute name="authorId" type="tns:AuthorId"/> ... </xsd:schema>
XSD Alapelemek Egyszerű típus: Összetett típus: Elem definiálása: xsd:simpleType csak szöveges elemek értéke és attribútuma lehet Összetett típus: xsd:complexType struktúrát definiál Elem definiálása: xsd:element Attribútum definiálása: xsd:attribute Egyszerű típus konstrukció: xsd:restriction xsd:union xsd:list
Használatuk XML-ben <x:author xmlns:x="http://example.org/publishing"> <!-- structure determined by complexType definition --> ... </x:author> Vagy <genericId xmlns:x="http://example.org/publishing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tns:AuthorId" >333-33-3333</genericId>
Szűkítési minták xsd:enumeration (lista) xsd:fractionDigits (a tizedesjegy után) xsd:length () xsd:maxExclusive xsd:maxInclusive xsd:maxLength xsd:minExclusive xsd:minInclusive xsd:minLength xsd:pattern xsd:totalDigits xsd:whiteSpace
Példa: Egyszerű típusok ... <xsd:simpleType name="RoyaltyRate"> <xsd:restriction base="xsd:double"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="100"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="Pubs2003"> <xsd:restriction base="xsd:date"> <xsd:minInclusive value="2003-01-01"/> <xsd:maxInclusive value="2003-12-31"/> <xsd:element name="rate" type="tns:RoyaltyRate"/> <xsd:element name="publicationDate" type="tns:Pubs2003"/>
Példa: Lexikális szűkítés ... <xsd:simpleType name="SSN"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-\d{2}-\d{4}"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="PublisherAssignedId"> <xsd:pattern value="\d{2}-\d{8}"/> <xsd:simpleType name="Phone"> <xsd:pattern value="\(\d{3}\)\d{3}-\d{4}"/> <xsd:element name="authorId" type="tns:SSN"/> <xsd:element name="pubsAuId" type="tns:PublisherAssignedId"/> <xsd:element name="phone" type="tns:Phone"/>
Példa: felsorolás ... <xsd:simpleType name="PublicationType"> <xsd:restriction base="xsd:NMTOKEN"> <xsd:enumeration value="Book"/> <xsd:enumeration value="Magazine"/> <xsd:enumeration value="Journal"/> <xsd:enumeration value="Online"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="pubType" type="tns:PublicationType"/>
Példa: unió ... <xsd:simpleType name="AuthorId"> <xsd:union memberTypes="tns:SSN tns:PublisherAssignedId"/> </xsd:simpleType> <xsd:element name="authorId" type="tns:AuthorId"/>
Komplex típusok xsd:complexType: névtér definiálás: xsd:sequence xsd:choice xsd:all ref névtér definiálás: ##any ##other ##targetNamespace ##local Lista
<xsd:complexType name="AddressType"> <xsd:all> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string" minOccurs="0"/> <xsd:element name="state" type="tns:State" minOccurs="0"/> <xsd:element name="zip" type="tns:Zip"/> </xsd:all> </xsd:complexType> <xsd:complexType name="PublicationsListType"> <xsd:choice maxOccurs="unbounded"> <xsd:element name="book" type="xsd:string"/> <xsd:element name="article" type="xsd:string"/> <xsd:element name="whitepaper" type="xsd:string"/> </xsd:choice> <xsd:complexType name="AuthorType"> <xsd:sequence> <xsd:choice> <xsd:element name="name" type="xsd:string"/> <xsd:element name="fullName" type="xsd:string"/> <xsd:element name="address" type="tns:AddressType"/> <xsd:element name="phone" type="tns:Phone" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="recentPublications„ type="tns:PublicationsListType"/> </xsd:sequence> <xsd:attribute name="id" type="tns:AuthorId"/> <xsd:element name="author" type="tns:AuthorType"/>
XPath W3C szabvány Az XML dokumentumot faként kezeli Gyökér Elem Tulajdonság Szöveg Megjegyzés Feldolgozási információ Névterek Segítségével csomópontokat, vagy csomópontok csoportjait jelölhetjük ki Elérési útvonalak csomópontok kijelölésére XPath operátorok és függvények
Miért használjuk XPath Az XSLT stílus lapokban, minta illesztésre A DOM-ban,csomópontok kiválasztására XML XPath XPath XML XPointer-ben, a dokumentumok csatolására SQL Server-nél, XML-t is tud generálni
Csomópont információk XPath fa struktúra és csomópont típusok A csomópontokbó kinyerhető információk DOM használata
XPath fa struktúra XML dokumentum XPath faként <catalog xmlns="urn:litwareinc"> <?proc instr?> <!--comment--> <product code="123"> Blue jeans </product> </catalog> "123" "Blue jeans" Root "urn:litware" "comment " "proc-instr" <product> "urn:litwareinc" <catalog>
A csomópontokból kinyerhető információk Minden csomópont rendelkezik tulajdonságokkal Csomópont típusok Gyökér Egyed Tulajdonság Szöveg Névtér Feld. utasítások Megjegyzés Tulajdonságok Érték Név Szülő csomóp. Gyerek csomóp.
Elérési útvonalak Elérési útvonal egy olyan XPath kifejezés mely XML dokumentumban egy vagy több elemet jelöl ki Lehet: Relatív A jelenlegi csomóponthoz viszonyítva Abszolút ”/” karakterrel kezdődik A gyökérhez viszonyítja
Elérési útvonalak Útvonalat ábrázol Balról jobbra vannak kiértékelve Relatív útvonal Abszolút útvonal Balról jobbra vannak kiértékelve Útvonal az XML dokumentumban Minden lépés három részből áll Példa lépés product/price /catalog/product/price axis::node-test[predicate]… child::product[price > 35.95][3]
Tengelyek self following child following-sibling parent preceding <catalog> <product code="123"> <price>35.99</price> </product> <product code="456"> <price>22.95</price> <discount> <amount>25</amount> </discount> <product code="789"> <price>185.00</price> </catalog> <catalog> <product code="123"> <price>35.99</price> </product> <product code="456"> <price>22.95</price> <discount> <amount>25</amount> </discount> <product code="789"> <price>185.00</price> </catalog> self following child following-sibling parent preceding attribute preceding-sibling descendant descendant-or-self ancestor ancestor-or-self Root node <catalog> <product> <product> <product> code=123 <price> code=456 <price> <discount> code=789 <price> 35.99 22.95 <amount> 185.00 25
Tengelyek használata A gyakori XPath tengelyeknek van rövidített alakja is A többinek nincs Példa – ancestor::node() Tengely Példa teljes Példa rövidített child child::price price attribute attribute::code @code self self::node() . parent parent::node() .. descendant-or-self /descendant-or-self()/price //price
Csomópont kritériumok Child examples Attribute examples Név alapján Egy adott név Minden csomóp. Név és névtér Minden csomóp. a név.térben Típus alapján axis::node-type-function() Például a gyermek tengelyen: price @code * @* aprefix:price @aprefix:code aprefix:* @aprefix:* text() processing-instruction() node() comment()
Predikátumok használata Egy lépés egy vagy több predikátumot használhat Csomópont gyűjtemény szűrése Pozíció Partalom Létezés alapján Több predikátumot is használhatunk Balról jobbra vannak kiértékelve axis::node-test[predicate]… product[last()] product[@code="123"] product[@code] product[3][@discount]
Operátorok és függvények használata Csomópont gyűjtemény kifejezések és függvények Logikai kifejezések és függvények Szám kifejezések és függvények Karakterlánc kifejezések és függvények
Csomópont gyűjtemény Az elérési útvonalak csomópont gyűjteményt adnak vissza Csomópont gyűjteményeket (“ | ”) jellel tudunk összefűzni Gyűjtemény függvények is használhatóak cd | dvd /*/(cd | dvd) (cd | dvd)/@capacity cd[position() = last()] count(cd[@capacity > 5.8])
Logikai kifejezések Logikai operátorok = != > >= < <= Logikai függvények Példa: product[(price > 25 and price < 35) or price > 50] true() false() boolean() not() lang() product[not(@code) and not(discount-policy)]
Szám kifejezések Egyenlőtlenség Bináris operátorok, + - * div mod Függvények Példa account[balance >= - overdraft-limit] account[(balance mod 100) > 0] number() floor() ceiling() round() sum() account[sum(transaction-amount) > 0]
Karakterláncok Kerekterlánc szűrő Karakterlánc módosító string-length(customer/@last-name) customer[ starts-with(@last-name, "Mac") ] customer[ contains(@last-name, "Mac") ] concat(@last-name, "[", @first-name, "]") substring(@middle-name, 1, 1) substring-before("12/3/1964", "/") or substring-after normalize-space(" To be or not to be ") translate(str, "aeiou", "AEIOU")
Tanácsok Rövidített szintakszist használjuk ha van Egyszerűbb karbantartani Kerüljük a túl általános kifejezéseket: // Ha tudjuk akkor szűkítsük le: /*/product Ne használjuk a count() –ot arra hogy megnáézzük van-e eleme Használjuk a last()-ot Ne használjuk a name() a név vizsgálatra Használjuk a namespace-URI() és local-name() függvényeket helyette
Bevezetés az XSLT-be Az XSLT alkalmazási területei Az XSLT mint deklaratív programozási nyelv XSLT stíluslap struktúra Minták definiálása Stíluslapok statikus használata Stíluslapok dinamikus használata Demó
Az XSLT felhasználási területei W3C gondozza XSL-ből származik Egy XML dokumentum más struktúrájú domukentummá konvertálása XML HTML-é konvertálása XML szöveggé konvertálása Adat szűrése, kinyerése, összefűzése
XSLT képességek Sok különböző transzformációra képes Példák: Egy XML szintaxis másikra cserélése Adat szűrés Adat rendezés XML átstruktúrálás Számítások elvégzése
XML HTML-é transzformálás XSLT XML dokumentum HTML dokumentum + XSLT processor XSLT stílus lap <employees> <employee> <name>Reid</name> <salary>91000</salary> </employee> … </employees> <HTML><TABLE> <TR> <TD>Reid</TD> <TD>91000</TD> </TR> … </TABLE></HTML>
XML más XML szintakszissá Más szintakszis XML dokumentum Más XML nyelvtan + XSLT processor XSLT stílus lap <employees> <employee> <name>Reid</name> <salary>91000</salary> </employee> … </employees> <staff> <staff-member name="Reid" pay="91000"/> … </staff>
XSLT mint deklaratív programozási nyelv Szabályokon, nem eljárásokon alapul A stílus lap szabályok bármilyen sorrendben végrehajthatóak A stílus lap szabályok egymástól függetlenek lehetnek A stílus lap szabályok független a bevitel, kimenet sorrendtől
XSLT stíluslap struktúra Egy <xsl:stylesheet> elem, vagy<xsl:transform> Felső szintű elemek. Pl.: sablon szabályok XSLT, Implementáció spec., Felh. Def. Utasítás elemek <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> </xsl:stylesheet> <xsl:template match="/"> … … … </xsl:template> <xsl:apply-templates select="employees/employee" /> <xsl:template match="employee"> … … … </xsl:template> <xsl:value-of select="name" />
Sablon szabályok definiálása A csomópontok kiválasztása a <xsl:template> egyezés tulajdonságával A gyökér elem sablon szabályának definiálása (megvalósítás függő) Kimenet produkálása a <xsl:value-of> elemmel <xsl:template match= "/"> <xsl:value-of select="//employee"/> </xsl:template>
Stíluslapok statikus használata Stíluslap statikus használata egy XML dokumentumban Használjuk a <?xml-stylesheet …?> elemet az XML dokumentumban Adjuk meg a stíluslap helyét <?xml-stylesheet type="text/xsl" href="MySheet.xsl"?> <employees> … XML document content … </employees>
Stíluslapok dinamikus használata XslTransform használata (jelenleg) XslCommand használata (2005) XslTransform xslttrans = new XslTransform(); xslttrans.Load(@"D:\users\bilickiv\dotnet\7es eloadas\stylesheet0701.xsl"); xslttrans.Transform(@"D:\users\bilickiv\dotnet\7es eloadas\demo0701.xml“ , @"D:\users\bilickiv\dotnet\7es eloadas\demo1eredmeny.txt", null); XsltCommand xslt = new XsltCommand(); xslt.OnMessageEvent += new QueryEventHandler(MessageCallBack); xslt.Compile("output.xsl"); xslt.Execute("books.xml", "books.html");
Sablon szabályok Sablon szabályok definiálása Sablon tartalom definiálása Több sablon szabály használata Literális eredmény elemek használata
Sablon szabályok definiálása A <xsl:template> szintakszis a leggyakrabban alkalmazott elem match vagy name XSLT Fa Modell Az XSLT transzformációk sorrendje <apply-templates> IE alap stíluslapja: res://msxml3.dll/defaultss.xsl
A sablon tartalom definiálása <xsl:value-of> a csomópont szöveges értékét írja ki <xsl:copy-of> a csomópont XML tartalmát írja ki <xsl:template match="employee"> <xsl:value-of select="name"/> <xsl:copy-of select="emergencycontact"/> </xsl:template> James Wilson <emergencycontact> <name>Kathryn Wilson</name> <relationship>Spouse</relationship> <contactnumber>425123456</contactnumber> </emergencycontact>
Sablon szabályok definiálása <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <HTML> <xsl:apply-templates/> </HTML> </xsl:template> <xsl:template match="employees"> <H1>Employees details</H1> <xsl:apply-templates/> <xsl:template match="employee"> <xsl:value-of select="name"/>, <xsl:value-of select="salary"/> </xsl:stylesheet>
Szöveges eredmény elemek HTML, szkript, vagy szöveg másolása a kimeneti fára XSLT részeket értelmezi az értelmező A névtér elemek kimásolódnak
Sablon szabály minták XPath kifejezések használata A rekurzív művelet használata (//) Boolean operátorok használata employees/employee/empname //employee/empname employees/employee[type='full' or type='part']
Sablonok illesztése válogatott mintára <xsl:apply-templates> alapértelmezett működése A sablonokat a gyermek elemekre illeszti Csak adott gyermek elemekre illeszteni: A select tulajdonság segítségével <xsl:apply-templates> <xsl:template match="/"> <xsl:apply-templates select=”employee”/> </xsl:apply-templates>
Névterek használata <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:nw="urn:nwtraders" xmlns:con="urn:contoso" > <xsl:template match="nw:employee"> <xsl:value-of select="nw:name"/> </xsl:template> <xsl:template match="con:employee"> <xsl:value-of select="con:surname"/>, <xsl:value-of select="con:given-name"/>, </xsl:stylesheet>
Ajánlott megoldások Használjunk explicit névtereket Ez lehetővé teszi az elem nevek szabad használatát Definiáljunk szabályokat a gyökér elemre Ekkor biztosak lehetünk a kódunk működésében
Csomópontok sorbarendezése Az XSLT segítségével sorbarendezhetjük a csomópontokat Használjuk a <xsl:sort> a <xsl:apply-templates> elemben Példa Minden <employee> elemre séma illesztés A <employee> elemek rendezése <name> érték alapján <xsl:apply-templates select="employee"> <xsl:sort select="name"/> </xsl:apply-templates>
Több rendező kulcs definiálása Több kulcsot is definiálhatunk Több <xsl:sort> elem segítségével Példa Rendezzük az <employee> elemeket <region> szerint Majd az <employee> elemek azonos <region> elemben név szerint vannak rendezve <xsl:apply-templates select="employee"> <xsl:sort select="region"/> <xsl:sort select="name"/> </xsl:apply-templates>
Rendezés finomítása <xsl:sort> a következő tulajdonságokkal rendelkezik: order – "ascending" vagy "descending" case-order – "upper-first" vagy "lower-first" lang – nyelv kód (pl.: "en") data-type – "text" vagy "number" Például Rendezzük az <employee> elemeket <salary> elem alapján csökkenő sorrendben <xsl:apply-templates select="employee"> <xsl:sort select="salary" order="descending" data-type="number"/> </xsl:apply-templates>
A kimenet testreszabása Számok formázása A szám formátumok lokalizálása A szóközök kezelése Az eredmény dokumentum definiálása XML kimenet definiálása HTML és szöveg kimenet definiálása
Számok formázása A format-number() segítségével Gyakori megoldások format-number(number, format-string) Gyakori megoldások 0 a szükséges és # az opcionális számra Használjuk a ,-t mint csoportosító és a .-t mint decimális eválasztót format-number(12345.729, '#000') 12346 format-number(12345.729, '#,000.00') 12,345.73 format-number() használata <xsl:value-of select="format-number(salary, '#.00')"/>
Lokális szabályok format-number()-ben Használjuk a <xsl:decimal-format> -ot a lokalizált szám formátum definiálására Példa <xsl:decimal-format name="Euro" grouping-separator="." decimal-separator=","/> format-number()-ben format-number(1234.5, '#,000.00', 'Euro') 1.234,50
Szóköz kezelése <A><B>Hello</B> <xsl:strip-space elements="*"/> Példák Szóköz eltávolítása minden elemből Szóköz megtartása megadott csomópontoknál <xsl:strip-space elements="name address"/> <xsl:preserve-space elements="paragraph heading"/> Szóköz eltváloítása megadott csomópontokból Szóköz eltávolítása <xsl:strip-space> Szóköz megtartása <xsl:preserve-space> A B C Hello World a white space node a text node another text node <A><B>Hello</B> <C>World</C></A>
Kimeneti formátum Az XSLT stílus lapok két fázisban dolgozódnak fel: Egy eredmény fa generálódik Az eredmény fa a kimeneti dokumentumba íródik A <xsl:output> segítségével megadhatjuk a kimenet típusát XML kimenet HTML kimenet Szöveg kimenet <xsl:output method="xml"… /> <xsl:output method="html"… /> <xsl:output method="text"… />
XML kimenet Az XSLT két XML kimenet típust tud generálni Jól formázott XML dokumentumokat Külső álltalános egyedek Az <xsl:output method="xml"/> elemben adhatjuk meg <xsl:output method="xml" encoding="iso-8859-1" indent="yes" cdata-section-elements="company script" doctype-system="employees.dtd"/>
HTML, Szöveg kimenet A <xsl:output method="html"/> segítségével lehet a HTML kimenetet testreszabni <xsl:output method="html" encoding="iso-8859-1" indent="yes"/> A <xsl:output method="text"/> segítségével lehet a szöveget testreszabni <xsl:output method="text" encoding="us-ascii"/>
Stíluslapok beszúrása Egy stíluslap felhasználhat másik stíluslapokat Ugyanúgy kell használnunk őket Példa <xsl:stylesheet…> … </xsl:stylesheet> Starter.xsl … <xsl:stylesheet…> … </xsl:stylesheet> <xsl:include href="Starter.xsl"/> <!–– use included rules ––>
Stíluslapok importálása Egy stíluslap felhasználhat másik stíluslapokat Az importált stíluslapok felülírhatóak Példa <xsl:stylesheet…> … </xsl:stylesheet> Starter.xsl … <xsl:stylesheet…> </xsl:stylesheet> <xsl:import href="Starter.xsl"/> <!–– use or override imported rules ––>
Felülírt szabályok Felülírás engedélyezése <xsl:apply-imports> Példa: <xsl:stylesheet…> <xsl:template match="salary"> … </xsl:stylesheet> Starter.xsl <xsl:stylesheet…> <xsl:import href="Starter.xsl"/> </xsl:stylesheet> <xsl:template match="salary"> </xsl:template> <B> <xsl:apply-imports/> </B>
Import sorrend Több stíluslapot tudunk beilleszteni és importálni Import precedence rules apply A.xsl B.xsl … import B.xsl New.xsl import A.xsl include C.xsl include E.xsl … C.xsl D.xsl … import D.xsl E.xsl import F.xsl F.xsl …
Tippek Definiáljunk konzisztens numerikus formátumot Ne használjuk az <xsl:output> elemet amíg nem szükséges Az XSLT gyakran kitalálja a követelményeket Definiáljunk könyvtárakat az atomi műveleteknek Újrahasznosítás: <xsl:include>, testreszabás: <xsl:import> Konzisztencia, skálázhatóság Fejlesztési, karbantartási idő csökken
A következő előadás tartalma Menedzselt kód