Kari Perttula

XML - skeemat

Tietotekniikan LuK-tutkielma

14.6.2003

Jyväskylän yliopisto

Tietotekniikan laitos


Tekijä: Kari Perttula

Yhteystiedot: pekaky@cc.jyu.fi

Työn nimi: XML-skeemat

Title in English: XML Schemas

Työ: LuK-tutkielma

Linja: Ohjelmistotekniikka.

Teettäjä: Jyväskylän yliopisto, tietotekniikan laitos

Avainsanat: XML-skeema, XML, DTD, SGML, leksikaalinen esitysmuoto, nimiavaruus, arvojoukko, perintä, sanastot, Busines2Busines.

Tiivistelmä: Käytetystä laitteistosta ja käyttöjärjestelmästä riippumattomaan tiedonesitykseen on kehitetty XML-kieli. Se ei kuitenkaan ota kantaa varsinaisen tietosisällön arvojoukkoihin, eikä tallennettavien tietoalkioiden keskinäiseen järjestykseen. Tutkielmassa käsiteltävä XML-skeema kehitettiin, jotta XML-dokumentin rakenne ja siihen tallennettavien tietoalkioiden sallitut arvojoukot voitaisiin paremmin määritellä. XML-skeemoja ymmärtävällä XML-parserilla voi tarkistaa käsiteltävän XML-dokumentin oikeamuotoisuuden ja sen, kuuluvatko annettujen tietoalkioiden arvot sallittuun arvojoukkoon.

Esipuhe

Ensimmäiseksi haluan kiittää kaikkia niitä henkilöitä, jotka ovat edesauttaneet tämän tutkielman valmistumista. Aivan erityinen kiitos kuuluu Jukka-Pekka Santaselle ja Tommi Lahtoselle runsaasta ja asiallisesta opastuksesta. Kiitos myös KS-Elektroniikka Oy:lle heidän tilauslomakkeestaan, josta sain muokattua tutkielmassa käytetyn esimerkkitapauksen.

Tämän tutkielman kirjoittaminen oli antoisa kokemus, sillä en tuntenut XML-teknologiaa ennestään kovin tarkasti. Myös tutkielman muoto on alkanut vähän kerrallaan selvitä ohjaajien avustuksella.

Termiluettelo

CSS (engl. Cascading Style Sheets) eli tyylitiedostot on tarkoitettu HTML- ja XML-dokumenttien ulkoasun määrittämiseen.

DTD (engl. Document Type Definition) on joukko sääntöjä, jotka määräävät, mitkä elementtityypit ovat sallittuja XML-dokumentin sisällä. Ne siis määrittävät kunkin elementtityypin sallitun sisällön ja attribuutit. DTD kuvaa myös kaikki ulkoiset elementit, joihin on viitattu dokumentin sisällä sekä käytettävissä olevat notaatiot [1].

HTML (engl. Hypertext Markup Language) on merkkauskieli, jolla määritellään hypertekstiä sisältäviä sivuja World Wide Webissä. Eräät HTML:n versiot ovat SGML:n sovellutuksia [1].

Nimiavaruus (engl. namespace) on tapa määrittää XML-dokumenteissa käytetyt nimet liittämällä ne URI:lla määriteltyyn kontekstiin [1].

SGML (engl. Standard Generalized Markup Language) on kansainvälinen standardi (ISO 8879:1986), joka määrittää yleisluontoisen merkkaustavan dokumenttien loogisen rakenteen esittämiseen järjestelmä- ja alustariippumattomalla tavalla. SGML on metakieli, eli kieli, jolla kuvataan merkkauskieliä [1].

XML (engl. Extensible Markup Language) on rakenteisten dokumenttien merkkauskieli. Se on laajennettavissa ja HTML:ää joustavampi.

XSL (engl. Extensible Stylesheet Language) on XML:n tyylikieli. Kyseinen koodausmenetelmä kertoo XML-dokumentin esittävälle sovellukselle, kuinka dokumentin elementit on esitettävä.

Sisältö

1 Johdanto
2 XML-skeemat
2.1 Mitä ovat XML-skeemat?
2.2 Mitä käytettiin ennen skeemoja?
2.3 Mihin skeemoja tarvitaan?
2.4 Muut skeemat
3 XML-skeeman muoto
3.1 Mistä XML-skeema rakentuu
3.2 Juurielementti
3.3 Elementin määrittely
3.4 Esimerkkiongelma
3.5 Tavoitteeksi asetettu XML-dokumentti
4 Halutun dokumentin validoiva skeema
4.1 XML-skeeman tunnisteet
4.2 XML-skeemalla validoitavan dokumentin muodon määrittelystä
4.3 Perintä
4.4 Ennalta määrätty arvojoukko
4.5 Elementin esiintymien määrääminen
4.6 Leksikaalisen esitysmuodon määrittäminen
4.7 XML-skeeman käytöstä esimerkkitapauksessa
4.8 Skeeman määrittelystä yleisemmin
5 Muutamia toteutettuja skeemoja ja sovelluksia
5.1 Instrument Markup Language
5.2 TranXML-kieli
5.3 XML-skeemaohjelmistoja
6 Yhteenveto
Lähteet
Liitteet
Liite 1. Malli tilauslomakkeesta
Liite 2. Tilausesimerkin XML-koodi
Liite 3. Esimerkki tilausdokumentin validoivasta XML-skeemasta

Lähteet

[1] North Simon ja Hermans Paul, (suomentanut Santala-Köykkä Riitta), "XML", Edita, IT-Press Helsinki, 2001.

[2] Fallside David C, "XML Schema Part 0: Primer ", saatavilla HTML-muodossa
<URL: http://www.w3.org/tr/xmlschema-0/ >, W3C, 2001.

[3] Walsh Norman, "Understanding XML Schemas", saatavilla HTML-muodossa,
<URL: http://www.xml.com/pub/a/1999/07/schemas/index.html>, O'Reilly & Assosiated, inc. 1999.

[4] Dumbill Edd, "Schemas for the Transportation Industry", saatavilla HTML-muodossa, <URL: http://www.xmlhack.com/read.php?item=1209>,
XMLhack, 2001.

[5] NASA, "Instrument Remote Control", saatavilla HTML-muodossa, <URL: http://pioneer.gsfc.nasa.gov/public/irc/>, NASA, luettu 7.11.2002.

[6] NASA, "Instrument Markup Language", saatavilla HTML-muodossa, <URL: http://pioneer.gsfc.nasa.gov/public/iml/>, NASA, luettu 7.11.2002.

[7] Transentric, "TranXML®", saatavilla HTML-muodossa, <URL: http://www.transentric.com/products/commerce/tranxml.asp>, Transentric in. luettu 7.11.2002.

[8] Transentric, "TranXML® Open Source License Agreement", saatavilla HTML-muodossa, <URL: http://www.transentric.com /products /commerce/license.asp>, Transentric inc, 2001.

[9] Altova, "xmlspy ", saatavilla HTML-muodossa,
<URL: http://www.xmlspy.com>, Altova, 2001.

[10] Netbryx Technologies, kotisivu, saatavilla HTML-muodossa,
<URL: http://www.editml.com> Netbryx Techonologies, 2000.

[11] Gertner Matthew,"ANN: XMLForms 1.0", saatavilla HTML-muodossa, <URL: http://lists.xml.org/archives/xml-dev/200103 /msg01190.html>, XML.org, 2001.

[12] Schemantix, kotisivu, saatavilla HTML-muodossa,
<URL: http://www.schemantix.com>, Schemantix 2001.

[13] Thompson Henry S. , et als, "XML Schema Part 1: Structures ", saatavilla HTML-muodossa, <URL: http://www.w3.org/TR/2001/PR-xmlschema-1-20010330/>, W3C, 2001.

[14] Biron Paul V, Malhotra Ashok, "XML-Schema Part 2: Datatypes ", saatavilla
HTML-muodossa, <URL: http://www.w3.org/TR/2001/PR-xmlschema-2-20010330/>, W3C, 2001.

Liite 1. Malli tilauslomakkeesta

Tilaaja
Yritys:______________________________
Nimi:_______________________________
Tilauksen hyväksynyt:__________________
Postiosoite:__________________________
Postinro ja toimipaikka:________________
___________________________________
Käyntiosoite:________________________
Postinro ja toimipaikka:________________
___________________________________
Kaupparekisterinumero:________________
Kotipaikka:__________________________

XYZ oy
puh: +358 14 831 0009
fax: +358 14 831 0001
________________________
Vuojärventie 130
41340 Laukaa

Kaupparekisterinumero 888.222
Kotipaikka Laukaa

Tilaus N:o_______________________

_____/_____ 20____

Toimitusaika_____________________

Toimitustapa_____________________

Toimituskulut: Vast.ottaja/Lähettäjä

________________________________

Hinnat: ALV0% / ALV22%

Koodi Nimeke Määrä Hinta Ale-% Toim.vko
         
           
           
           
           
           
           
           
           
           
           

Allekirjoitus__________________________________

Liite 2. Tilausesimerkin XML-koodi

<?xml version="1.0"?>

<!-- edited with XML Spy v3.5 (http://www.xmlspy.com) by Kari Perttula (private) -->

<!-- Kaikki tässä dokumentissa esiintyvät tiedot on hankittu ns hiha-metodilla.-->

<tilaus>

<päiväys>17.6.2001</päiväys>

<numero>32047</numero>

<tilaaja>

<yritys>Tmi Villen vekottimet</yritys>

<nimi>Ville Kurppa</nimi>

<puhelinnumero>+358 14 555 9800</puhelinnumero>

<faksinumero>+358 14 555 9811</faksinumero>

<tilauksen-hyväksynyt>Ville Kurppa </tilauksen-hyväksynyt>

<osoite>

<postiosoite>

<osoite>PL 999</osoite>

<postinumero>40101</postinumero>

<postitoimipaikka>Jyväskylä</postitoimipaikka>

</postiosoite>

<käyntiosoite>

<osoite>Volmarinkatu 47</osoite>

<postinumero>40720</postinumero>

<postitoimipaikka>Jyväskylä</postitoimipaikka>

</käyntiosoite>

</osoite>

<rekisteri-tiedot>

<kaupparekisteri_numero>999.111 </kaupparekisteri_numero>

<kotipaikka>Jyväskylä</kotipaikka>

</rekisteri-tiedot>

</tilaaja>

<toimittaja>

<yritys>ab XYZ oy</yritys>

<nimi/>

<puhelinnumero>+358 14 831 0009</puhelinnumero>

<faksinumero>+358 14 831 0001</faksinumero>

<osoite>

<postiosoite>

<osoite>Vuojärventie 130</osoite>

<postinumero>41340</postinumero>

<postitoimipaikka>Laukaa</postitoimipaikka>

</postiosoite>

<käyntiosoite>

<osoite>Vuojärventie 130</osoite>

<postinumero>41340</postinumero>

<postitoimipaikka>Laukaa</postitoimipaikka>

</käyntiosoite>

</osoite>

<rekisteri-tiedot>

<kaupparekisteri_numero>888.222 </kaupparekisteri_numero>

<kotipaikka>Laukaa</kotipaikka>

</rekisteri-tiedot>

</toimittaja>

<toimitusehdot>

<toimitusaika>1 vk</toimitusaika>

<toimitustapa>matkahuolto</toimitustapa>

<toimituskulut>lähettäjä</toimituskulut>

<ALV-kanta>0 %</ALV-kanta>

</toimitusehdot>

<rivit>

<tilausrivi>

<koodi>06-99-196</koodi>

<nimeke>Hilavitkutin nro 3</nimeke>

<määrä>8</määrä>

<hinta>1399.00</hinta>

<alennus_prosentti>20</alennus_prosentti>

<toimitusviikko/>

</tilausrivi>

<tilausrivi>

<koodi>12-00-124</koodi>

<nimeke>Hilavitkutin nro 12</nimeke>

<määrä>12</määrä>

<hinta>1248.00</hinta>

<alennus_prosentti>12</alennus_prosentti>

<toimitusviikko/>

</tilausrivi>

<tilausrivi>

<koodi>07-99-005</koodi>

<nimeke>Hilavitkuttimen nro3 pehmustettu kantolaukku </nimeke>

<määrä>5</määrä>

<hinta>285.80</hinta>

<alennus_prosentti>10</alennus_prosentti>

<toimitusviikko/>

</tilausrivi>

<tilausrivi>

<koodi>01-88-007</koodi>

<nimeke>Hilavitkuttimen nro1 pääakseli</nimeke>

<määrä>1</määrä>

<hinta>580.00</hinta>

<alennus_prosentti>10</alennus_prosentti>

<toimitusviikko/>

</tilausrivi>

</rivit>

</tilaus>

Liite 3. Esimerkki tilausdokumentin validoivasta XML-skeemasta

<?xml version="1.0" encoding="UTF-8"?>

<!-- edited with XML Spy v3.5 (http://www.xmlspy.com) by Kari Perttula (private) -->

<xsd:schema xmlns:xsd= "http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified">

<xsd:element name="tilaus">

<xsd:annotation>

<xsd:documentation>Tilauslomake</xsd:documentation>

</xsd:annotation>

<xsd:complexType>

<xsd:sequence>

<xsd:element name="päiväys" type= "päiväysTyyppi"/>

<xsd:element name="numero" type="xsd:short"/>

<xsd:element name="tilaaja" type= "tilaajaTyyppi"/>

<xsd:element name="toimittaja" type= "toimittajaTyyppi"/>

<xsd:element name="Toimitusehdot" type= "ehdotTyyppi"/>

<xsd:element name="kommentti" type="xsd:string" minOccurs="0" maxOccurs="1"/>

<xsd:element name="rivit" type="rivitTyyppi"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:complexType name="tilaajaTyyppi">

<xsd:simpleContent>

<xsd:restriction base="yleisYhteystietoTyyppi"/>

</xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="toimittajaTyyppii">

<xsd:simpleContent>

<xsd:restriction base="yleisYhteystietoTyyppi">

<xsd:sequence>

<xsd:element name="yritys" type="xsd:string" minOccurs="0"/>

<xsd:element name="nimi" type="xsd:string"/>

<xsd:element name="puhelinnumero" type="puhNroTyyppi" minOccurs="0"/>

<xsd:element name="faksinumero" type="puhNroTyyppi" minOccurs="0"/>

<xsd:element name="tilauksen-hyväksynyt" type="xsd:string" minOccurs="0" maxOccurs="0"/>

<xsd:element name="osoite" type="osoiteTyyppi"/>

<xsd:element name="rekisteri-tiedot" type="rekisteriTyyppi"/>

</xsd:sequence>

</xsd:restriction>

<xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="rivitTyyppi">

<xsd:sequence>

<xsd:element name="tilausrivi" type="riviTyyppi" maxOccurs="unbounded"/>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType name="ehdotTyyppi">

<xsd:sequence>

<xsd:element name="toimitusaika" type="xsd:string"/>

<xsd:element name="toimitustapa" type="xsd:string"/>

<xsd:element name="toimituskulut" type="toimituskulutTyyppi"/>

<xsd:element name="ALV-kanta" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType name="toimituskulutTyyppi">

<xsd:simpleContent>

<xsd:restriction base="xsd:string">

<xsd:enumeration value="lähettäjä"/>

<xsd:enumeration value="vastaanottaja"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="yleisYhteystietoTyyppi">

<xsd:simpleContent>

<xsd:restriction>

<xsd:sequence>

<xsd:element name="yritys" type="xsd:string" minOccurs="0"/>

<xsd:element name="nimi" type="xsd:string"/>

<xsd:element name="puhelinnumero" type="puhNroTyyppi" minOccurs="0"/>

<xsd:element name="faksinumero" type="puhNroTyyppi" minOccurs="0"/>

<xsd:element name="tilauksen-hyväksynyt" type="xsd:string"/>

<xsd:element name="osoite" type="osoiteTyyppi"/>

<xsd:element name="rekisteri-tiedot" type="rekisteriTyyppi"/>

</xsd:sequence>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

<xsd:simpleType name="puhNroTyyppi">

<xsd:restriction base="xsd:string"/>

</xsd:simpleType>

<xsd:complexType name="osoiteTyyppi" mixed="true">

<xsd:simpleContent>

<xsd:restriction>

<xsd:sequence>

<xsd:element name="postiosoite" type="postiosoiteTyyppi"/>

<xsd:element name="käyntiosoite" type="käyntiosoiteTyyppi"/>

</xsd:sequence>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="postiosoiteTyyppi" mixed="true">

<xsd:sequence>

<xsd:choice minOccurs="1" maxOccurs="2">

<xsd:element name="osoite" type="plOsoiteTyyppi" minOccurs="0"/>

<xsd:element name="osoite" type="katuOsoiteTyyppi" minOccurs="0"/>

</xsd:choice>

<xsd:element ref="postinumero"/>

<xsd:element name="postitoimipaikka" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType name="käyntiosoiteTyyppi">

<xsd:sequence>

<xsd:element name="osoite" type="katuOsoiteTyyppi" minOccurs="1" maxOccurs="2"/>

<xsd:element ref="postinumero"/>

<xsd:element name="postitoimipaikka" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

<xsd:simpleType name="katuOsoiteTyyppi">

<xsd:restriction base="xsd:string"/>

</xsd:simpleType>

<xsd:simpleType name="plOsoiteTyyppi">

<xsd:restriction base="katuOsoiteTyyppi">

<xsd:pattern value="pl[0-9]{3}"/>

<xsd:pattern value="PL[0-9]{3}"/>

<xsd:pattern value="pl [0-9]{3}"/>

<xsd:pattern value="PL [0-9]{3}"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:complexType name="rekisteriTyyppi">

<xsd:sequence>

<xsd:element name="kaupparekisteri_numero" type="xsd:string"/>

<xsd:element name="kotipaikka" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

<xsd:element name="postinumero">

<xsd:simpleType>

<xsd:restriction base="xsd:string">

<xsd:pattern value="\d{5}"/>

</xsd:restriction>

</xsd:simpleType>

</xsd:element>

<xsd:complexType name="päiväysTyyppi">

<xsd:simpleContent>

<xsd:restriction base="xsd:string">

<xsd:pattern value="[0-9] {1} ( [0-9] {1} ) . [0-9] {1} ( [0-9] {1} ) . [0-9] {2} ( [0-9] {2} ) ?"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="riviTyyppi">

<xsd:sequence>

<xsd:element name="koodi" type="koodiTyyppi"/>

<xsd:element name="nimeke" type="xsd:string"/>

<xsd:element name="määrä" type="einegatiivinenDesimaaliTyyppi"/>

<xsd:element name="hinta" type="hintaTyyppi"/>

<xsd:element name="alennus_prosentti" type="prosenttiTyyppi"/>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType name="prosenttiTyyppi">

<xsd:simpleContent>

<xsd:restriction base="xsd:desimal">

<xsd:totalDigits value="5"/>

<xsd:fractionDigits value="2"/>

<xsd:minInclusive value="0.00"/>

<xsd:maxInclusive value="100.00"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="hintaTyyppi">

<xsd:simpleContent>

<xsd:restriction base="xsd:desimal">

<xsd:totalDigits value="8"/>

<xsd:fractionDigits value="2"/>

<xsd:minInclusive value="0.00"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="einegatiivinenDesimaaliTyyppi">

<xsd:simpleContent>

<xsd:restriction base="xsd:desimal">

<xsd:minInclusive value="0.0"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

<xsd:complexType name="koodiTyyppi">

<xsd:simpleContent>

<xsd:restriction base="xsd:string">

<xsd:pattern value="\d{2}-\d{2}-\d{3}"/>

</xsd:restriction>

</xsd:simpleContent>

</xsd:complexType>

</xsd:schema>