690 likes | 774 Views
Programrendszerek fejlesztése. Bilicki Vilmos bilickiv @ inf.u-szeged.hu. A mai előadás tartalma:. 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
E N D
Programrendszerek fejlesztése Bilicki Vilmos bilickiv@inf.u-szeged.hu
A mai előadás tartalma: • 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/
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: • 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:restriction> </xsd:simpleType> <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:restriction base="xsd:string"> <xsd:pattern value="\d{2}-\d{8}"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="Phone"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\(\d{3}\)\d{3}-\d{4}"/> </xsd:restriction> </xsd:simpleType> <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: • 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> <xsd:complexType name="AuthorType"> <xsd:sequence> <xsd:choice> <xsd:element name="name" type="xsd:string"/> <xsd:element name="fullName" type="xsd:string"/> </xsd:choice> <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:complexType> <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
XPath XML XML XML Miért használjuk Az XSLT stílus lapokban,minta illesztésre A DOM-ban,csomópontok kiválasztására XPath XPointer-ben, a dokumentumok csatolására SQL Server-nél,XML-t is tud generálni
Root <catalog> "urn:litware" "proc-instr" "comment " <product> "urn:litwareinc" "123" "Blue jeans" XPath fa struktúra • XML dokumentum XPath faként <catalog xmlns="urn:litwareinc"> <?proc instr?> <!--comment--> <product code="123"> Blue jeans </product> </catalog>
A csomópontokból kinyerhető információk • Minden csomópont rendelkezik tulajdonságokkal • Tulajdonságok • Érték • Név • Szülő csomóp. • Gyerek csomóp. • Csomópont típusok • Gyökér • Egyed • Tulajdonság • Szöveg • Névtér • Feld. utasítások • Megjegyzés
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 product/price • Útvonalat ábrázol • 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 /catalog/product/price axis::node-test[predicate]… child::product[price > 35.95][3]
Tengelyek <catalog> <product code="123"> <price>35.99</price> </product> <product code="456"> <price>22.95</price> <discount> <amount>25</amount> </discount> </product> <product code="789"> <price>185.00</price> </product> </catalog> <catalog> <product code="123"> <price>35.99</price> </product> <product code="456"> <price>22.95</price> <discount> <amount>25</amount> </discount> </product> <product code="789"> <price>185.00</price> </product> </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ó • Tartalom • 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] boolean() not() lang() true() false() 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 szintaxist 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
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> <xsl:template match="employee"> <xsl:value-of select="name"/>, <xsl:value-of select="salary"/> </xsl:template> </xsl:stylesheet>
Szöveges eredmény elemek • HTML, szkript, vagyszövegmá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: • Aselecttulajdonsá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:template> </xsl:stylesheet>