DTD:n puutteita DTD ei ole XML-muotoinen Jäsennys vaatii omat työkalut Eri dokumenttityyppien yhteiskäyttöä ei tueta DTD-määritelmien lainailua ja yhdistelyä ei voi validoida Tietotyyppejä on rajoitetusti: sisältöä ei voi täysin validoida Arvoalueita ei voi määritellä On vain yksi merkkijonotyyppi Sekasisällön voi määritellä vain yhdellä tava Käyttö rajoittuu tekstidokumenttien tekstisisältöön ID-tyyppiset attribuuttien arvot globaaleja koko dokumentissa Attribuuteille, elementeille ja tekstisisällölle ei voi määritellä avainrajoitteita W3C:n tavoite kehittää parempi määrittelykieli ilmaisuvoimaisempi, XML-rakenteinen mahdollista käsitellä xml-työkaluilla itsedokumentoiva enemmän tietotyyppejä, myös omia yksinkertainen Tekniseltä kannalta tuki nimiavaruuksille käyttäjän omat tietotyypit määritysten perintä tuki määritysten evoluutiolle upotettu dokumentaatio 1 2 W3C:n dokumentit (28.10.2004) Part 0: Primer Selkeät kuvaukset, paljon esimerkkejä Ei-normatiivinen määrittely Part 1: Structures Elementtien ja attribuuttien määrittely Sisältömit Skeeman tietomi Skeema-validointi Part 2: Datatypes Tyyppien määrittely (sekä simple että complex) Esimerkkidokumentteja Dokumentista Part 0: Primer po.xml, po.xsd Erilaisia määrittelyjä elementeille ja attribuuteille Globaaleja ja paikisia määritelmiä Yksinkertaisia tyyppejä: ei elementtisisältöä, ei attribuutteja Komplekseja tyyppejä: elementtisisältö ja/tai attribuutteja Jaettuja tyyppejä Pakollisuusrajoitteita 3 4 perustuu tietotyyppimäärityksiin yksinkertaiset (merkkauksia sisältämättömät) rakenteiset Elementtimääritys kytkee elementin tietotyyppiin yksinkertaiseen tai rakenteiseen Attribuuttimääritys kytkee attribuutin yksinkertaiseen tietotyypiin Esimerkki dokumentti: <card> <name>john Doe</name> <title>ceo, Widget Inc.</title> <email>john.doe@widget.com</email> <phone>(202) 555-1414</phone> <logo uri="widget.gif"/> </card> 5 6 Harri Laine 1
käytettävä xml-kieli (nimistö) lyhenne <xsd:schema xmlns:xsd tunnus ="http://www.w3.org/2001/xmlschema"> <xsd:element name="card" type="card_type"/> <xsd:element name="name" type="xsd:string"/> <xsd:element name="title" type="xsd:string"/> <xsd:element name="email" type="xsd:string"/> <xsd:element name="phone" type="xsd:string"/> <xsd:element name="logo" type="logo_type"/> <xsd:attribute name="uri" type="xsd:anyuri"/> <xsd:complextype name="card_type"> <xsd:element ref="name"/> valinnaisia <xsd:element ref="title"/> <xsd:element ref="email"/> <xsd:element ref="phone" minoccurs="0"/> <xsd:element ref="logo" minoccurs="0"/> rakenteinen tyyppi <xsd:complextype name="logo_type"> <xsd:attribute ref= uri" use="required"/> </xsd:schema> 7 8 / yksinkertaiset tyypit primitiivityypit Yksinkertainen tietotyyppi on joukko merkkijonoja, joihin liittyy semanttinen tulkinta Esim. decimal: desimaaliluvuksi tulkittava merkkijono merkkijonojen välille on määritelty järjestys XML schema:ssa on määritelty joukko primitiivityyppejä sekä mekanismit johdettujen tyyppien määrittelyyn rajoitteiden, listakonstruktion ja yhdisteen avulla ennalta määritelty merkitys 9 string any Unicode string boolean true, false, 1, 0 decimal 3.1415 valinnainen aikavyöhyketieto float 6.02214199E23 double 42E970 datetime 2004-09-26T16:29:00-05:00 time 16:29:00-05:00 date 2004-09-26 hexbinary 48656c6c6f0a base64binary SGVsbG8K anyuri http://www.brics.dk/ixwt/ QName rcp:recipe, recipe... 10 johdettuja tyyppejä johdettuja tyyppejä määrittelee valmiiksi myös joitain johdettuja tyyppejä positiveinteger nonpositiveinteger long ID IDREF NMTOKEN Name jne 11 Rajoitteet johdettujen tyyppien määrittelyssä Rajoite esitetään piirremäärityksen (facet) avulla length, minlength, maxlength pattern (säännöllinen lauseke) enumeration (luetteloalkio) whitespace (tyhjän tilan käsittely) maxinclusive, maxexclusive, mininclusive, minexclusive (ala ja ylärajoja) totaldigits, fractiondigits 12 Harri Laine 2
johdettuja tyyppejä johdettuja tyyppejä Ala- ja ylärajat <xsd:simpletype name="score_from_0_to_100"> <xsd:restriction base="xsd:integer"> <xsd:mininclusive value="0"/> <xsd:maxinclusive value="100"/> 13 Säännöllinen lauseke rajoittimena <xsd:simpletype name="percentage"> <xsd:restriction base="xsd:string"> <xsd:pattern value="([0-9] [1-9][0-9] 100)%"/> Luettelo rajoittimena <xsd:simpletype name="kieli"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="en" /> <xsd:enumeration value="fi" /> 14 johdettuja tyyppejä johdettuja tyyppejä Listatyyppi perustyypeistä <xsd:simpletype name="integerlist"> <xsd:list itemtype="xsd:integer"/> Tyhjätilamerkein eroteltu lista perustyypin mukaisia merkkijonoja 15 Yhdistetyyppi <xsd:simpletype name="suomiruotsi_sana"> <xsd:union> <xsd:simpletype> <xsd:restriction base="suomenkielen_sana"/> <xsd:simpletype> <xsd:restriction base="ruotsinkielen_sana"/> </xsd:union> 16 Attribuuttiin voidaan kytkeä vain yksinkertaisia tyyppejä. Elementteihin voidaan kytkeä joko yksinkertaisia tai rakenteisia tyyppejä (complex type) Nimestään huolimatta rakenteisen tyypin määrittely on oikeastaan elementin sisällön ja/tai elementin attribuuttien määrittely määrittelyssä ei viitata alkeellisempiin tietotyyppeihin vaan viittaukset kohdistuvat elementteihin ja attribuutteihin Rakenteisen tyypin määrittely muodostuu elementti- tai attribuuttiviittauksista (tai elementtien ja attribuuttien esittelyistä), jotka kootaan erityisten rakenne-elementtien avulla rakenteiksi elementtiviittaus <xsd:element ref="nimi" /> attribuuttiviittaus <xsd:attribute ref="nimi" /> 17 18 Harri Laine 3
Rakenne esitetään peräkkäisyys-, valinta-, tai kokoelmaelementtien avulla sequence-elementti sulkee sisäänsä peräkkäiset elementit a-elementtiä seuraa b-elementti, esitetään tällöin <xsd:complextype name= ab > choice-elementti sulkee sisäänsä vaihtoehtoiset elementit jokin elementeistä a, b tai c esitetään: <xsd:complextype name= oneof_abc > <xsd:choice> <xsd:element ref= c /> </xsd:choice> 19 20 Toisto esitetään elementtiviittauksen attribuuttien minoccurs ja MaxOccurs avulla. Näiden oletusarvona on 1. Toistomääreet voi liittää myös rakenne-elementteihin a?b*cc?: mahdollisesti a, sitten 0-n b:tä sitten 1-2 c:tä <xsd:complextype name= repeating > <xsd:element ref= a minoccurs= 0 /> <xsd:element ref= b minoccurs= 0 maxoccurs= unbounded /> <xsd:element ref= c maxoccurs= 2 /> Järjestämättömän kokoelman määrittelyyn on tarjolla -elementti a,b ja vähintään yksi c missä tahansa järjestyksessä <xsd:> <xsd:element ref= c maxoccurs= unbounded /> <xsd:> 21 22 Elementtiviittaus identifioi tietyn elementtityypin. Sen asemesta voidaan käyttää any-elementtiä viittaamaan mihin tahansa elementtityyppiin. Tarvittaessa any-elementtiin voidaan liittää namespace - attribuutti, jolla rajoitetaan situt elementit kyseiseen nimistöön (kieleen) kuuluviin, a XHTML:ään <xsd:complextype name="whateverxhtml"> <xsd:any namespace="http://www.w3.org/1999/xhtml" minoccurs=0 maxoccurs="unbounded"> 23 Rakenne-elementtien sisäkkäistä käyttöä on rajoitettu, seuraavat upotukset kiellettyjä: sequence choice choice sequence 24 Harri Laine 4
Rakenteisen tyyppin määrittelyyn voidaan sisällyttää myös attribuuttiviittauksia. Jos tyyppiin sisältyy sekä elementtirakenne että attribuuttiviittauksia on elementtirakenteen oltava määrityksessä aiemmin. Attribuuttiviittaukseen voidaan liittää attribuutti use, arvot: optional (oletusarvona) ja required kuvaamaan pakollisuutta <xsd:complextype name="order_type" mixed="true"> <xsd:choice> <xsd:element ref="address"/> <xsd:element ref="email" merkkitietoa ja elementtejä minoccurs="0" maxoccurs="unbounded"/> <xsd:element ref="phone"/> </xsd:choice> <xsd:attribute ref= id" use="required"/> 25 26 Edellä esitetyillä rakenteilla ei pystytä määrittelemään elementtejä, joiden sisältö on merkkitietoa ja joilla on attribuutteja Tätä varten on oma rakenteensa <xsd:complextype name="styled_text"> <xsd:simplecontent> <xsd:extension base="xsd:string"> <xsd:attribute ref="style" use="required" /> </xsd:extension> </xsd:simplecontent> Myös restriction-rakennetta voi käyttää <xsd:complextype name="labelled_short_styled_text"> <xsd:simplecontent> <xsd:restriction base="styled_text"> <xsd:maxlength value="20"/> <xsd:attribute ref="label" /> </xsd:simplecontent> näillä siis attribuutti style ja label 27 28 Edellisen kaltaista laajennusmekamismia voi käyttää myös rakenteisten tyyppien yhteydessä <xsd:complextype name= ab > käytetään hyväksi aiempaa määritystä <xsd:complextype name= abc > <xsd:complexcontent> <xsd:extension base="ab /> <xsd:element ref= c /> </xsd:complexcontent> 29 :ssa on rakenteen määrittelyyn tarjolla myös DTD:n nimettyjä parametrikohteita vastaava group-rakenne, samoin attributegroup: <group name="heading"> <choice> <element ref="xhtml:h1" /> <element ref="xhtml:h2" /> <element ref="xhtml:h2" /> </choice> </group> <complextype name="block" midex="true"> <choice minoccurs="0" maxoccurs="unbounded"> <element ref="xhtml:p" /> <group ref="xhtml:heading" /> </choice> <complextype> 30 Harri Laine 5
Edellä kaikki elementti- ja tyyppimäärittelyt on esitetty erillisinä nimettyinä elementteinä (ns. global style). Näin ei välttämättä tarvitse tehdä, vaan elementtimäärittelyn voi upottaa rakenteisen tyypin määrittelyyn. Myös attribuuttiesittelyt voidaan upottaa. Upotetuilla määrityksillä ei ole nimeä, joten niitä ei voi uudelleenkäyttää Määrittely nimettyjä elementtejä käyttäen: <xsd:element name="card type="card_type"/> <xsd:element name="name type="xsd:string"/> <xsd:complextype name="card_type"> <xsd:element ref="name"/>... 31 32 Määrittely upottama rakennetieto elementtimäärittelyyn: <xsd:element name="card > <xsd:complextype> <xsd:element name="name type="xsd:string"/>... Kaikki upotettuina: <xsd:complextype name="purchaseordertype"> <xsd:element name="shipto" type="usaddress"/> <xsd:element name="billto" type="usaddress"/> <xsd:element ref="comment" minoccurs="0"/> <xsd:element name="items" type="items"/> <xsd:attribute name="orderdate" type="xsd:date"/> 33 34 <xsd:complextype name="items"> <xsd:element name="item" minoccurs="0 maxoccurs="unbounded"> <xsd:complextype> <xsd:element name="productname" type="xsd:string"/> <xsd:element name="quantity"> <xsd:simpletype> <xsd:restriction base="xsd:positiveinteger"> <xsd:maxexclusive value="100"/> <xsd:element name="usprice" type="xsd:decimal"/> <xsd:element ref="comment" minoccurs="0"/> <xsd:element name="shipdate" type="xsd:date minoccurs="0"/> <xsd:attribute name="partnum" type="sku use="required"/> 35 36 Harri Laine 6
Tyhjät elementit <xsd:element name="product"> <xsd:complextype> <xsd:attribute name="prodid" type="xsd:positiveinteger"/> 37 Harri Laine 7