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.
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.
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ä.
simpleType
-tietorakenteen määrittely,complexType
-tietorakenteen määrittely,<?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</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</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</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</hinta>
<alennus_prosentti>10</alennus_prosentti>
<toimitusviikko/>
</tilausrivi>
</rivit>
</tilaus>
<?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:schema
). Samalla on määritelty nimiavaruus (xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
), ja sille kahva xsd
(engl. handle, tag). Kyseisellä rivillä määritelty nimiavaruus on voimassa siinä elementissä (ja alielementeissä), jossa se on määritelty. Tässä tapauksessa siis koko skeemassa. xsd
tilalle olisi voitu valita myös joku muu merkkijono. Ilman etuliitettä (engl. prefix) merkityt elementin tai tietotyypin nimet viittaavat oletusnimiavaruuteen, joka tässä skeemassa tarkoittaa skeemaa itseään. Oletusnimiavaruudeksi voidaan määrätä myös jokin ulkopuolinen skeema (tai DTD). <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified">
ja
</xsd:schema>
<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:annotation>
ja sen muoto on määritelty complexType
-elementissä. tilaus
-elementin alielementit. Näiden rakenne määritellään paikassa, johon kunkin elementin type
-attribuutti viittaa. Lisäksi kommentti
-elementti voi esiintyä validoitavassa dokumentissa korkeintaan yhden kerran, mutta sitä ei välttämättä tarvitse dokumentista löytyä (minOccurs="0" maxOccurs="1"
). Oletusarvoisesti skeemassa mainittu elementti on löydyttävä dokumentista tasan yhden kerran, ellei muuta ole merkitty. XML-skeemassa määritettyjen elementtien on oltava validoitavassa dokumentissa siinä järjestyksessä, minkä XML-skeema määrittelee. <xsd:complexType name="tilaajaTyyppi">
<xsd:simpleContent>
<xsd:restriction base="yleisYhteystietoTyyppi"/>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="toimittajaTyyppi">
<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>
maxOccurs
arvoksi asetettu unbounded, jolloin kyseessä olevan elementin esiintymien lukumäärän ylärajaa ei ole mitenkään rajoitettu. <xsd:complexType name="rivitTyyppi">
<xsd:sequence>
<xsd:element name="tilausrivi" type="riviTyyppi" maxOccurs="unbounded"/>
</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>
minInclusive
ja maxInclusive
arvo. minOccurs
arvoksi nolla. <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>
maxOccurs
voidaan määrittää elementin esiintymien lukumäärälle yläraja, tai sallia rajoittamaton määrä elementtejä antamalla attribuutille maxOccurs
arvoksi unbound. Mikäli attribuuttille maxOccurs
ei ole määritetty arvoa, käytetään oletusarvoa 1
. Attribuutin maxOccurs
arvon tulee olla suurempi tai yhtäsuuri kuin attribuutin minOccurs
arvon. sequence
-elementtien välissä olevien elementtien tulee esiintyä XML-dokumentissa samassa järjestyksessä, kuin ne on esitetty XML-skeemassa. choice
-elementtien välissä esitellyistä elementeistä valitaan dokumenttiin yksi, ellei attribuutein muuta osoiteta. Alla on esitetty esimerkki sekä sequence
- että choice
-elementin käytöstä. <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>
plOsoiteTyyppi.
<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>
plOsoiteTyyppi
perustuu katuOsoiteTyyppi
-elementin kautta perustietotyyppiin string siten, että plOsoiteTyyppi
ä oleva elementti voi saada arvokseen minkä tahansa merkkijonon. Kyseisen merkkijonon tulee kuitenkin alkaa merkeillä pl tai PL, joita seuraa välilyönti ja kolme numeroa tai kolme numeroa ilman välilyöntiä. a,b,e,k
] tai merkkijakson alku ja loppu hakasulkeissa [f-o
]. Myös edellisten tapojen yhdistelmä on mahdollinen [a-c,f,h,v-z
]. Luku aaltosuluissa, merkkimäärityksen jäljessä, kertoo sen, kuinka monta kyseistä merkkiä tulee olla. Mikäli merkkimääritys annetaan kaarisulkujen sisässä, voi kyseisen merkin jättää pois. Seuraavassa esimerkissä on määritelty päiväyksen esitysmuoto. <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>
date
, mutta se on määritelty ISO-standardin 8601 mukaiseksi. Tällöin päiväys on muotoa 2001-08-16 (vvvv-kk-pp). Kun halutaan käyttää suomalaisittain tutumpaa muotoa 16.8.2001, joudutaan määrittelemään uusi tietotyyppi. päiväysTyyppi
-elementissä on siis yksi tai kaksi numeroa, piste, yksi tai kaksi numeroa, piste ja kaksi tai neljä numeroa. <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="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>
prosenttiTyyppi
-elementti voi saada arvokseen desimaaliluvun, jossa on korkeintaan viisi numeroa (totalDigits
). Numeroista kaksi on varattu desimaaliosalle (fractionDigits
). Pienin sallittu arvo on 0.00
(minInclusive
) ja suurin 100.00
(maxInclusive
). 99999.99
. Pienin sallittu arvo on 0.00
, joten palautukset eivät ole mahdollisia tilauslomaketta käyttäen. <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="koodiTyyppi">
<xsd:simpleContent>
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{2}-\d{2}-\d{3}"/>
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
[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.
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__________________________________
<?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>
<?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>