XML schémata

Transkript

XML schémata
XML schémata
XML – teorie a praxe značkovacích jazyků (IZI238)
Jirka Kosek
Poslední modifikace: $Date: 2006/12/29 15:51:25 $
Copyright © 2001-2006 Jiří Kosek
Obsah
Úvod ........................................................................................ 4
Proč potřebujeme schéma dokumentů XML ............................... 5
Přínosy použití schématu ........................................................ 6
Jazyky pro popis schématu ..................................................... 7
Jaký jazyk používat? .............................................................. 8
Ukázky .................................................................................... 9
Ukázkový dokument ............................................................ 10
DTD ................................................................................... 11
W3C XML Schema ................................................................ 12
Relax NG ............................................................................ 13
Relax NG (Kompaktní syntaxe) .............................................. 14
Schematron ........................................................................ 15
DTD ....................................................................................... 16
DTD – Definice typu dokumentu ............................................ 17
Ukázka DTD a dokumentu ..................................................... 18
Deklarace elementů ............................................................. 19
Deklarace atributů ............................................................... 20
Připojení DTD k dokumentu .................................................. 21
Parsery .............................................................................. 22
Parametrické entity .............................................................. 23
Jmenné prostory ................................................................... 25
Jmenné prostory ................................................................. 26
Zkracování zápisu ................................................................ 28
Pár poznámek ..................................................................... 30
Základy W3C XML Schema ..................................................... 31
XML schéma se zapisuje v XML .............................................. 32
Datové typy ........................................................................ 33
Přehled zabudovaných typů .................................................. 34
Samodokumentující formát ................................................... 35
Jednoduché typy ................................................................... 36
Jednoduché datové typy ....................................................... 37
Lexikální a hodnotový prostor ................................................ 38
Vytváření vlastních typů (Vytvoření a použití typu pro měnové
údaje) ................................................................................ 39
Vytváření vlastních typů (Vytvoření typu pro kód měny, deklarace
atributu) ............................................................................ 40
Komplexní typy ..................................................................... 41
Komplexní typy ................................................................... 42
Sekvence elementů (xs:sequence) ......................................... 43
Výběr jednoho z elementů (xs:choice) .................................... 44
Elementy v libovolném pořadí (xs:all) ..................................... 46
Prázdný element ................................................................. 47
Smíšený obsah .................................................................... 48
Atributy .............................................................................. 49
Jmenné prostory ................................................................... 50
Co to jsou jmenné prostory ................................................... 51
Globální deklarace ............................................................... 53
Lokální deklarace ................................................................. 54
Validace ................................................................................. 55
Připojení schéma k dokumentu (Nepoužíváme vlastní jmenný
prostor) ............................................................................. 56
Připojení schéma k dokumentu (Používáme vlastní jmenný
prostor) ............................................................................. 57
Podpora schémat v parserech ................................................ 58
Přístupy k návrhu schématu .................................................. 59
Struktura schématu ............................................................. 60
Matrjóška ........................................................................... 61
Salámová kolečka ................................................................ 62
Metoda slepého Benátčana .................................................... 63
Best practices pro návrh ....................................................... 65
Pokročilé vlastnosti ............................................................... 66
Práce s prázdnými hodnotami (NULL) ..................................... 67
Zajištění jedinečnosti hodnot ................................................. 68
Ukázka unikátního klíče ........................................................ 69
Referenční integrita ............................................................. 70
Objektově orientované rysy .................................................. 71
Kombinování schémat ........................................................... 72
Kombinování schémat .......................................................... 73
RELAX NG + Schematron ...................................................... 74
WXS + Schematron ............................................................. 76
Validace komponovaných dokumentů ..................................... 77
Další zdroje informací ............................................................ 78
Odkazy .............................................................................. 79
Úvod
Proč potřebujeme schéma dokumentů XML ....................................
Přínosy použití schématu .............................................................
Jazyky pro popis schématu ..........................................................
Jaký jazyk používat? ...................................................................
Copyright © 2001-2006 Jiří Kosek
5
6
7
8
XML schémata
(strana 4)
Proč potřebujeme schéma dokumentů XML
• XML umožňuje vytvářet dokumenty s libovolně pojmenovanými a
vnořenými elementy
• příliš volnosti škodí
• formáty pro výměnu dat
• schéma XML dokumentu umožňuje definovat
• elementy a atributy použitelné v dokumentu
• přípustné možnosti kombinování jednotlivých elementů
• datový typ pro obsah elementu/atributu
• další integritní omezení
• schéma XML dokumentu plní podobnou funkci jako schéma relační
databáze
Úvod
Copyright © 2001-2006 Jiří Kosek
XML schémata
1 / 56 (strana 5)
Přínosy použití schématu
• schéma je formální definice jazyka (výměnného formátu) založeného
na XML
• dokument XML můžeme kdykoliv během jeho životního cyklu validovat
• validace = ověření shody dokumentu se schématem
• validace výrazně zjednodušuje kontroly vstupu na úrovni aplikace
• komfortnější zadávání dat do editorů XML
• snazší programová manipulace s dokumenty XML (PSVI, data-binding)
• generování dokumentace
• informace ze schématu potřebují některé další navazující XML jazyky
– například dotazovací jazyk XQuery
Úvod
Copyright © 2001-2006 Jiří Kosek
XML schémata
2 / 56 (strana 6)
Jazyky pro popis schématu
• DTD
• nejstarší, vychází ještě z SGML, přímo součást specifikace XML
• nepodporuje jmenné prostory a datové typy
• W3C XML Schema
• podpora jmenných prostorů, datových typů
• poměrně složitá specifikace
• široká podpora komerčních firem: MS, IBM, Oracle, Sun, …
• Relax NG
• nový a elegantní jazyk pro popis schématu
• podpora zatím spíše jen ve světě OSS
• standardizováno v rámci OASIS a ISO
• Schematron
• sada XPath výrazů, které musí dokument splňovat
Úvod
Copyright © 2001-2006 Jiří Kosek
XML schémata
3 / 56 (strana 7)
Jaký jazyk používat?
• nepotřebujeme jmenné prostory a datové typy ⇒ DTD
• potřebujeme jmenné prostory a datové typy
• nemusíme používat nástroje od MS, IBM, Oracle, Sun ⇒ Relax NG
• musíme používat nástroje od MS, IBM, Oracle, Sun ⇒ W3C XML
Schema
• různé jazyky pokrývají různé potřeby
• projekt DSDL (Document Schema Definition Languages)
• standardní prostředí pro validaci oproti několika schématům
• vzniká na půdě ISO
Úvod
Copyright © 2001-2006 Jiří Kosek
XML schémata
4 / 56 (strana 8)
Ukázky nejpoužívanějších jazyků pro popis
schématu dokumentu
Ukázkový dokument .................................................................
DTD ........................................................................................
W3C XML Schema ....................................................................
Relax NG .................................................................................
Relax NG (Kompaktní syntaxe) ...................................................
Schematron .............................................................................
Copyright © 2001-2006 Jiří Kosek
10
11
12
13
14
15
XML schémata
(strana 9)
Ukázkový dokument
<?xml version="1.0" encoding="utf-8"?>
<zamestnanci>
<zamestnanec id="101">
<jmeno>Jan</jmeno>
<prijmeni>Novák</prijmeni>
<email>[email protected]</email>
<email>[email protected]</email>
<plat>25000</plat>
<narozen>1965-12-24</narozen>
</zamestnanec>
<zamestnanec id="102">
<jmeno>Petra</jmeno>
<prijmeni>Procházková</prijmeni>
<email>[email protected]</email>
<plat>27500</plat>
<narozen>1974-13-21</narozen>
</zamestnanec>
</zamestnanci>
Ukázky
Copyright © 2001-2006 Jiří Kosek
XML schémata
5 / 56 (strana 10)
DTD
<!ELEMENT zamestnanci (zamestnanec+)>
<!ELEMENT zamestnanec (jmeno, prijmeni, email+,
plat?, narozen)>
<!ELEMENT jmeno
(#PCDATA)>
<!ELEMENT prijmeni
(#PCDATA)>
<!ELEMENT email
(#PCDATA)>
<!ELEMENT plat
(#PCDATA)>
<!ELEMENT narozen
(#PCDATA)>
<!ATTLIST zamestnanec
id
CDATA #REQUIRED>
Ukázky
Copyright © 2001-2006 Jiří Kosek
XML schémata
6 / 56 (strana 11)
W3C XML Schema
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="zamestnanci">
<xs:complexType>
<xs:sequence>
<xs:element name="zamestnanec"
maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="jmeno" type="xs:string"/>
<xs:element name="prijmeni" type="xs:string"/>
<xs:element name="email" type="xs:string"
maxOccurs="unbounded"/>
<xs:element name="plat" type="xs:decimal"
minOccurs="0"/>
<xs:element name="narozen" type="xs:date"/>
</xs:sequence>
<xs:attribute name="id" type="xs:int"
use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Ukázky
Copyright © 2001-2006 Jiří Kosek
XML schémata
7 / 56 (strana 12)
Relax NG
<?xml version="1.0" encoding="utf-8"?>
<element xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
name="zamestnanci">
<oneOrMore>
<element name="zamestnanec">
<attribute name="id">
<data type="int"/>
</attribute>
<element name="jmeno">
<data type="string"/>
</element>
<element name="prijmeni">
<data type="string"/>
</element>
<oneOrMore>
<element name="email">
<data type="string"/>
</element>
</oneOrMore>
<optional>
<element name="plat">
<data type="decimal"/>
</element>
</optional>
<element name="narozen">
<data type="date"/>
</element>
</element>
</oneOrMore>
</element>
Ukázky
Copyright © 2001-2006 Jiří Kosek
XML schémata
8 / 56 (strana 13)
Relax NG
Kompaktní syntaxe
• element zamestnanci {
element zamestnanec {
attribute id { xsd:int },
element jmeno { xsd:string },
element prijmeni { xsd:string },
element email { xsd:string }+,
element plat { xsd:decimal }?,
element narozen { xsd:date }
}+
}
Ukázky
Copyright © 2001-2006 Jiří Kosek
XML schémata
9 / 56 (strana 14)
Schematron
<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.ascc.net/xml/schematron">
<pattern name="Globální kontroly">
<rule context="zamestnanci">
<assert test="zamestnanec">V seznamu musí být alespoň jeden ►
zaměstnanec</assert>
<report test="sum(zamestnanec/plat) &gt; 500000">Součet platů nemůže ►
být větší než 500.000,-</report>
</rule>
</pattern>
<pattern name="Duplicita osobních čísel">
<rule context="zamestnanec">
<report test="count(../zamestnanec[@id = current()/@id]) &gt; ►
1">Duplicitiní osobní číslo
<value-of select="@id"/> u elementu <name/>.</report>
</rule>
</pattern>
</schema>
Ukázky
Copyright © 2001-2006 Jiří Kosek
XML schémata
10 / 56 (strana 15)
DTD
DTD – Definice typu dokumentu .................................................
Ukázka DTD a dokumentu .........................................................
Deklarace elementů ..................................................................
Deklarace atributů ....................................................................
Připojení DTD k dokumentu .......................................................
Parsery ...................................................................................
Parametrické entity ...................................................................
Copyright © 2001-2006 Jiří Kosek
17
18
19
20
21
22
23
XML schémata
(strana 16)
DTD – Definice typu dokumentu
• DTD je jazyk pro definici nových jazyků, které základní syntaxí vycházejí
z XML
• DTD umožňuje definovat:
• elementy použitelné v dokumentu
• jejich přípustné vztahy
• atributy použitelné u jednotlivých elementů a jejich typ
• DTD má v XML podobný význam jeho schéma v relačních databázích
• dokument vyhovující DTD = validní dokument
• lze kontrolovat pomocí validujícího parseru
• v současné době existuje mnoho DTD, které definují jazyky používané
v mnoha oblastech
• WML, XHTML, DocBook, SVG, MathML, RSS, …
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
11 / 56 (strana 17)
Ukázka DTD a dokumentu
Příklad 1. DTD – dtd/dokument.dtd
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
dokument
nadpis
autor
odstavec
em
(nadpis, autor?, odstavec+)>
(#PCDATA)>
(#PCDATA)>
(#PCDATA|em)*>
(#PCDATA)>
Příklad 2. Dokument vyhovující DTD – dtd/dokument.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE dokument SYSTEM "dokument.dtd">
<dokument>
<nadpis>Nadpis</nadpis>
<odstavec>Píšu <em>zvýrazněně</em> i normálně.</odstavec>
<odstavec>Ještě jeden.</odstavec>
</dokument>
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
12 / 56 (strana 18)
Deklarace elementů
• <!ELEMENT název model obsahu>
• model obsahu:
• sekvence – (a,b,c,d)
• alternativa – (a|b|c)
• ANY
• EMPTY
• (#PCDATA)
• opakování
• element – právě jednou
• element? – 0 nebo 1
• element+ – alespoň jednou
• element* – libovolný počet
• lze navzájem kombinovat pomocí závorek
(nazev, (autor|editor)?, p*, (nadpis,p+)*)
• každý element použitý v modelu obsahu musí být samostatně
deklarován
• smíšený obsah
• element obsahuje jak text, tak další elementy na stejné úrovni
• <!ELEMENT p (#PCDATA|em|strong)*>
• neumožňuje kontrolovat počet a pořadí podelementů
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
13 / 56 (strana 19)
Deklarace atributů
• <!ATTLIST element
název typ default. hodnota>
• typy
• CDATA, NMTOKEN, NMTOKENS, ID, IDREF, IDREFS, ENTITY,
ENTITIES, výčet
• default. hodnota:
• "hodnota"
• #REQUIRED
• #IMPLIED
• #FIXED "hodnota"
Příklad 3. Ukázka deklarace atributů a jejich použití v dokumentu
<!ATTLIST odstavec
id
ID
#REQUIRED
zarovnání (vlevo|nastřed|vpravo) #IMPLIED
autor
CDATA
"nobody">
<odstavec id="n012"
autor="Jan Novák">...</odstavec>
<odstavec id="n3.4.1"
zarovnání="nastřed">...</odstavec>
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
14 / 56 (strana 20)
Připojení DTD k dokumentu
• DTD se přidává pomocí deklarace typu dokumentu (DOCTYPE)
• DTD v externím souboru (externí podmnožina)
<!DOCTYPE dokument SYSTEM "dok.dtd">
<dokument>
...
</dokument>
jedno DTD lze používat opakovaně
• DTD přímo v dokumentu (interní podmnožina)
<!DOCTYPE dokument [
<!ELEMENT ...>
...
<!ATTLIST ...>
...
]>
<dokument>
...
</dokument>
nepraktické, protože nemůžeme DTD využít opakovaně
• lze kombinovat interní a externí DTD
<!DOCTYPE dokument SYSTEM "dok.dtd" [
<!ELEMENT ...>
...
<!ATTLIST ...>
...
]>
<dokument>
...
</dokument>
lokální deklarace mají přednost před externími → pomocí parametrů
lze upravit DTD
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
15 / 56 (strana 21)
Parsery
• MSXML
• standardní komponenta IE a dalších MS aplikací
• velmi rychlý
• lze využívat ze všech jazyků přes COM rozhraní
• spuštění např. pomocí WSH skriptu
msxml dokument.xml
1
• POZOR – IE validaci neprovádí (lze doplnit plug-in )
2
• Xerces
• open-source implementace v Javě i C++
• spuštění ve validačním režimu
xerces -v dokument.xml
3
• xmllint (součást libxml2)
• open source implementace v C dostupná pro Unix i Windows
• velmi rychlý
• kontrola well-formdness
xmllint --noout dokument.xml
• validace
xmllint --noout --valid dokument.xml
1
http://www.microsoft.com/downloads/details.aspx?FamilyId=D23C1D2C-1571-4D61-BDA8-ADF9F6849DF9&displaylang=en
2
http://xml.apache.org/xerces2-j/
3
http://xmlsoft.org/
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
16 / 56 (strana 22)
Parametrické entity
• podobné použití jako textové entity, ale lze je použít pouze v rámci
DTD
• interní parametrické entity
<!ENTITY % všude "id
ID
#REQUIRED
autor CDATA 'nobody'">
<!ATTLIST nadpis
%všude;>
<!ATTLIST odstavec
%všude;
zarovnání (vlevo|vpravo) "vlevo">
použití: společné atributy, opakující se modely obsahu
• externí parametrické entity
<!ENTITY % ISOpub SYSTEM "iso-pub.ent">
%ISOpub;
použití: modularizace DTD, opakované využití standardních entit
v různých DTD
• standardizované sady entit – http://www.w3.org/2003/entities/
Příklad 4. Načtení deklarací pomocí parametrické entity –
dtd/parametricke-entity.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE demo [
<!ENTITY % isopub SYSTEM ►
"http://www.w3.org/2003/entities/iso9573-2003/isopub.ent">
%isopub;
]>
<demo>
Nyní můžu použí znakové entity jako &ndash; nebo &dagger;
</demo>
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
17 / 56 (strana 23)
Parametrické entity (Pokračování)
Příklad 5. Soubor isopub.ent
…
<!ENTITY
<!ENTITY
<!ENTITY
<!ENTITY
<!ENTITY
<!ENTITY
<!ENTITY
<!ENTITY
…
emsp "&#x2003;">
ensp "&#x2002;">
numsp "&#x2007;">
puncsp "&#x2008;">
thinsp "&#x2009;">
hairsp "&#x200A;">
mdash "&#x2014;">
ndash "&#x2013;">
DTD
Copyright © 2001-2006 Jiří Kosek
XML schémata
17 / 56 (strana 24)
Jmenné prostory
Jmenné prostory ...................................................................... 26
Zkracování zápisu ..................................................................... 28
Pár poznámek .......................................................................... 30
Copyright © 2001-2006 Jiří Kosek
XML schémata
(strana 25)
Jmenné prostory
• slouží k rozlišení elementů a atributů se shodnými jmény v případech
kdy by mohlo dojít ke konfliktům
• aplikace si vybere jen ty části dokumentu, které umí zpracovat
• kombinování více „sad značek“ dohromady
• např.: XSLT styly (XSLT instrukce × HTML kód), XHTML stránka
s obrázky v SVG, …
• jména a elementů a atributů se skládají ze dvou částí – ze jmenného
prostoru a z lokálního názvu
• jmenné prostory se identifikují pomocí URI adresy, ale nic konkrétního
se na ní nevyskytuje, slouží pouze jako identifikátor
• pro zkrácení zápisu se při deklaraci jmenného prostoru vytvoří prefix,
který jmenný prostor zastupuje:
<prefix:element xmlns:prefix="http://example.org/neco"> …
</prefix:element>
• prefixy je možné použít i u atributů a elementů obsažených v elementu
s deklarací
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
18 / 56 (strana 26)
Jmenné prostory (Pokračování)
Příklad 6. Dokument se jmennými prostory
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:svg="http://www.w3.org/2000/svg">
<head>
<title>Ukázka webové stránky
s vektorovým obrázkem</title>
</head>
<body>
<p>Zajímavý obrázek:</p>
<svg:svg width="4in" height="3in">
<svg:desc>This is a blue circle with
a red outline</svg:desc>
<svg:g>
<svg:circle style="fill: blue; stroke: red" cx="200"
cy="200" r="100"/>
<svg:text x=".5in" y="2in">Hello World</svg:text>
</svg:g>
</svg:svg>
</body>
</html>
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
18 / 56 (strana 27)
Zkracování zápisu
• explicitně uváděné prefixy
<ceník:nabídka
xmlns:ceník="urn:cz-trade:cenik"
xmlns:bib="http://book.org/bibliography">
<ceník:položka>
<ceník:název>
<bib:book>
<bib:author>Jiří Kosek</bib:author>
<bib:title>HTML - tvorba dokonalých
WWW stránek</bib:title>
</bib:book>
</ceník:název>
<ceník:cena měna="CZK">259</ceník:cena>
</ceník:položka>
</ceník:nabídka>
• implicitní jmenné prostory (prefix je prázdný)
<nabídka xmlns="urn:cz-trade:cenik"
xmlns:bib="http://book.org/bibliography">
<položka>
<název>
<bib:book>
<bib:author>Jiří Kosek</bib:author>
<bib:title>HTML - tvorba dokonalých
WWW stránek</bib:title>
</bib:book>
</název>
<cena měna="CZK">259</cena>
</položka>
</nabídka>
• jmenné prostory se stejným prefixem se navzájem překrývají
<nabídka xmlns="urn:cz-trade:cenik">
<položka>
<název>
<book xmlns="http://book.org/bibliography">
<author>Jiří Kosek</author>
<title>HTML - tvorba dokonalých
WWW stránek</title>
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
19 / 56 (strana 28)
Zkracování zápisu (Pokračování)
</book>
</název>
<cena měna="CZK">259</cena>
</položka>
</nabídka>
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
19 / 56 (strana 29)
Pár poznámek
• prefix + lokální jméno = kvalifikované jméno (QName)
• atribut bez prefixu nepatří přímo do žádného jmenného prostoru:
• ani když je jeho element v implicitním jmenném prostoru
• patří tam však nepřímo, protože se vždy vztahuje k elementu,
u kterého je uvedený
<nabídka xmlns="urn:cz-trade:cenik">
<položka>
<název>
...
</název>
<cena měna="CZK">259</cena>
</položka>
</nabídka>
• atribut měna v tomto případě nepatří do jmenného prostoru
urn:cz-trade:cenik
• na druhou stranu patří k elementu cena, který již do daného
jmenného prostoru patří
• specifikace jmenných prostorů doplňuje standard XML
• dokumenty se jmennými prostory nelze validovat oproti DTD bez toho,
aby se vytvořil speciální kříženec všech použitých DTD
• jmenný prostor neodpovídá DTD ani XML schématu, nicméně obvykle
pro každý jmenný prostor někde existuje popis použitelných elementů
a atributů nejčastěji právě ve formě DTD nebo XML schématu
• jmenné prostory se hodně používají v dalších jazycích souvisejících
s XML – XML schémata, XSLT, …
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
20 / 56 (strana 30)
Základy W3C XML Schema
XML schéma se zapisuje v XML ...................................................
Datové typy .............................................................................
Přehled zabudovaných typů .......................................................
Samodokumentující formát ........................................................
Copyright © 2001-2006 Jiří Kosek
32
33
34
35
XML schémata
(strana 31)
XML schéma se zapisuje v XML
<zamestnanec id="101">
<jmeno>Jan</jmeno>
<prijmeni>Novák</prijmeni>
<plat>25000</plat>
<narozen>1965-12-24</narozen>
</zamestnanec>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="zamestnanec">
<xs:complexType>
<xs:sequence>
<xs:element name="jmeno" type="xs:string"/>
<xs:element name="prijmeni" type="xs:string"/>
<xs:element name="plat" type="xs:decimal"/>
<xs:element name="narozen" type="xs:date"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:schema>
• všechny elementy a datové typy patří do jmenného prostoru XML
schémat (http://www.w3.org/2001/XMLSchema)
• pro každý element/atribut musíme určit datový typ
Základy W3C XML Schema
Copyright © 2001-2006 Jiří Kosek
XML schémata
21 / 56 (strana 32)
Datové typy
• lze použít pro obsah atributů i elementů
• komplexní × jednoduché typy
• komplexní – obsahují další elementy a atributy
• jednoduché – obsahují pouze jednu hodnotu (řetězec, číslo apod.)
• od existujících typů lze odvozovat typy vlastní
• jednoduché typy:
• textový řetězec, celá/desetinná čísla a jejich varianty
• binární data, logická hodnota
• datum, čas, časový interval
• typy převzaté z DTD pro snazší přechod
• typy lze rozšiřovat/omezovat – obdoba integritních omezení
• lze definovat referenční integritu
Základy W3C XML Schema
Copyright © 2001-2006 Jiří Kosek
XML schémata
22 / 56 (strana 33)
Přehled zabudovaných typů
Základy W3C XML Schema
Copyright © 2001-2006 Jiří Kosek
XML schémata
23 / 56 (strana 34)
Samodokumentující formát
• přímo součástí schématu může být dokumentace
• pomocí XSLT lze pak generovat přehlednou dokumentaci schématu
v HTML (http://titanium.dstc.edu.au/xml/xs3p/)
<xs:element name="zamestnanec">
<xs:annotation>
<xs:documentation>Element slouží pro uchování důležitých
údajů o zaměstnanci.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:annotation>
<xs:documentation>
<p xmlns="http://www.w3.org/1999/xhtml">Dokumentace
může být klidně v <a ►
href="http://www.w3.org/TR/xhtml1/">XHTML</a>.</p>
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="jmeno" type="xs:string"/>
<xs:element name="prijmeni" type="xs:string"/>
<xs:element name="plat" type="xs:decimal"/>
<xs:element name="narozen" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Základy W3C XML Schema
Copyright © 2001-2006 Jiří Kosek
XML schémata
24 / 56 (strana 35)
Jednoduché typy
Jednoduché datové typy ............................................................ 37
Lexikální a hodnotový prostor .................................................... 38
Vytváření vlastních typů (Vytvoření a použití typu pro měnové
údaje) ..................................................................................... 39
Vytváření vlastních typů (Vytvoření typu pro kód měny, deklarace
atributu) ................................................................................. 40
Copyright © 2001-2006 Jiří Kosek
XML schémata
(strana 36)
Jednoduché datové typy
• vlastní typy lze odvodit z již definovaných typů pomocí restrikce,
vytvořením seznamu nebo sjednocením typů
• u většiny typů lze definovat různá integritní omezení:
• řetězce – length, minLength, maxLength, pattern, enumeration,
whiteSpace
• číselné typy – maxInclusive, maxExclusive, minInclusive,
minExclusive, totalDigits, fractionDigits, pattern, enumeration
• binární data – length, minLength, maxLength, pattern, enumeration,
whiteSpace
Jednoduché typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
25 / 56 (strana 37)
Lexikální a hodnotový prostor
• většina integritních omezení pracuje nad prostorem hodnot
• různé hodnoty z XML dokumentu se převedenou na skutečnou
hodnotu
• 3.5 a 3.500 se chápe stejně, pokud to jsou čísla
• 3.5 a 3.500 se chápe odlišně, pokud jsou v elementech typu xs:string
• nad lexikálním prostorem pracují vzory (pattern)
• lexikální prostor je tvořen znaky zapsanými přímo v dokumentu XML
s následně upravenými bílými znaky
• všechny bílé znaky (konec řádky, tabulátor) jsou nahrazeny
mezerou
• více mezer je nahrazeno jedinou mezerou, mezery na začátku a
na konci jsou odstraněny
• pravidla se neaplikují na typy xs:string a xs:normalizedString
• nejčastěji se nad ním definuje omezení pomocí regulárního výrazu
• regulární výrazy používají perlovou syntaxi
• příklad – DIČ: \d{3}-\d{10}
Jednoduché typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
26 / 56 (strana 38)
Vytváření vlastních typů
Vytvoření a použití typu pro měnové údaje
• maximální částka 1 milión
• přesnost na haléře
<cenaVýrobku>23.50</cenaVýrobku>
<!-- Vytvoření uživatelského datového typu -->
<xs:simpleType name="částka">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxExclusive value="1000000"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<!-- Definice elementu využívající nový datový typ -->
<xs:element name="cenaVýrobku" type="částka"/>
Jednoduché typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
27 / 56 (strana 39)
Vytváření vlastních typů
Vytvoření typu pro kód měny, deklarace atributu
<cena měna="USD">23.50</cena>
<!-- Definice typu výčtem -->
<xs:simpleType name="kódMěny">
<xs:restriction base="xs:string">
<xs:enumeration value="CZK"/>
<xs:enumeration value="EUR"/>
<xs:enumeration value="USD"/>
</xs:restriction>
</xs:simpleType>
<!-- Element má jednoduchý obsah (číslo) rozšířený o atribut -->
<xs:element name="cena">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="částka">
<xs:attribute name="měna" type="kódMěny"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
Jednoduché typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
28 / 56 (strana 40)
Komplexní typy
Komplexní typy ........................................................................
Sekvence elementů (xs:sequence) ..............................................
Výběr jednoho z elementů (xs:choice) .........................................
Elementy v libovolném pořadí (xs:all) .........................................
Prázdný element ......................................................................
Smíšený obsah .........................................................................
Atributy ..................................................................................
Copyright © 2001-2006 Jiří Kosek
42
43
44
46
47
48
49
XML schémata
(strana 41)
Komplexní typy
• modelování elementů, které obsahují další elementy nebo atributy
• lze určit pořadí elementů, jejich opakování, volitelnost atd.
<xs:element name="kniha">
<xs:complexType>
<xs:sequence>
<xs:element name="nazev" type="xs:string"/>
<xs:element name="autor" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="odstavec" type="xs:string"/>
<xs:element name="obrazek" type="xs:base64Binary"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
• sekvence za sebou jdoucích elementů – <xs:sequence>
• výběr jednoho z elementů – <xs:choice>
• nezáleží na pořadí elementů – <xs:all>
• vytvoření skupiny – <xs:group>
• lze vzájemně kombinovat
• smíšený obsah (mezi elementy se může objevit text) – <xs:complexType
mixed="true">
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
29 / 56 (strana 42)
Sekvence elementů
xs:sequence
• všechny elementy se musí objevit v zadaném pořadí
• počet opakování elementu lze určit pomocí maxOccurs a minOccurs
• implicitní hodnoty: maxOccurs=1, minOccurs=1
• pro nekonečno se používá hodnota unbounded
<článek>
<název>Ukázka</název>
<autor>Pepa</autor>
<odstavec>...</odstavec>
<odstavec>...</odstavec>
</článek>
<xs:element name="článek">
<xs:complexType>
<xs:sequence>
<xs:element name="nadpis" type="xs:string"/>
<xs:element name="autor" type="xs:string"
minOccurs="0"/>
<xs:element name="odstavec" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
30 / 56 (strana 43)
Výběr jednoho z elementů
xs:choice
• může se vyskytnout pouze jeden z uvedených podelementů
<osoby>
<osoba>
<jméno>Pepa Tuzemec</jméno>
<RČ>681203/0123</RČ>
</osoba>
<osoba>
<jméno>Pepa Cizinec</jméno>
<pas>1234567</pas>
</osoba>
<osoba>
<jméno>Pepa Rozvědčík</jméno>
<SSN>987654321</SSN>
</osoba>
</osoby>
<xs:element name="osoby">
<xs:complexType>
<xs:sequence>
<xs:element name="osoba" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="jméno" type="xs:string"/>
<xs:choice>
<xs:element name="RČ" type="xs:string"/>
<xs:element name="pas" type="xs:string"/>
<xs:element name="SSN" type="xs:string"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
• chybou je uvést více než jednu variantu:
<osoba>
<jméno>Pepa Pochybil</jméno>
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
31 / 56 (strana 44)
Výběr jednoho z elementů (Pokračování)
<pas>1234567</pas>
<RČ>681203/0123</RČ>
</osoba>
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
31 / 56 (strana 45)
Elementy v libovolném pořadí
xs:all
• podobně jako xs:sequence, ale nezáleží na pořadí výskytu
• počet opakování může být pouze 0 nebo 1
<osoba>
<jméno>Jan</jméno>
<příjmení>Novák</příjmení>
</osoba>
<osoba>
<příjmení>Novák</příjmení>
<jméno>Jan</jméno>
</osoba>
<osoba>
<titul>Ing.</titul>
<jméno>Jan</jméno>
<příjmení>Novák</příjmení>
</osoba>
<osoba>
<jméno>Jan</jméno>
<příjmení>Novák</příjmení>
<titul>CSc.</titul>
</osoba>
<xs:element name="osoba">
<xs:complexType>
<xs:all>
<xs:element name="jméno" type="xs:string"/>
<xs:element name="příjmení" type="xs:string"/>
<xs:element name="titul" type="xs:string"
minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
32 / 56 (strana 46)
Prázdný element
• nemá žádný obsah – text, podelementy, …
• může obsahovat pouze atributy
<img src="obrazek.png"/>
<!-- Zkrácená syntaxe -->
<xs:element name="img">
<xs:complexType>
<xs:attribute name="src" type="xs:anyURI"/>
</xs:complexType>
</xs:element>
<!-- Ekvivalent v plné syntaxi -->
<xs:element name="img">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:attribute name="src" type="xs:anyURI"/>
</xs:restriction>
<xs:complexContent>
</xs:complexType>
</xs:element>
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
33 / 56 (strana 47)
Smíšený obsah
• mezi elementy se může objevit text
• funguje trochu odlišně než smíšený obsah v DTD
• po vynechání textu musí podelementy vyhovět definici komplexního
typu
<odstavec>Odstavce typicky obsahují <pojem>smíšený
obsah</pojem>. Text se může střídat
s <odkaz url="http://www.kosek.cz">odkazy</odkaz>
a dalšími <pojem>elementy</pojem>.</odstavec>
<odstavec>Odstavec může obsahovat i jen text.</odstavec>
<odstavec><pojem>Nebo jen element.</pojem></odstavec>
<xs:element name="odstavec">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="pojem" type="xs:string"/>
<xs:element name="odkaz">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="url" type="xs:anyURI"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
34 / 56 (strana 48)
Atributy
• jsou součástí komplexních typů
• mohou obsahovat jen jednoduché typy
• default – standardní hodnota atributu, doplní se v případě, že atribut
chybí
• use – povinnost atributu
• optional – nepovinný
• required – povinný
• prohibited – zakázaný (může se využít při odvozování typů)
<xs:element name="img">
<xs:complexType>
<xs:attribute name="src" type="xs:anyURI"
use="required"/>
<xs:attribute name="alt" type="xs:string"
use="required"/>
<xs:attribute name="title" type="xs:string"
default="Bez titulku"/>
</xs:complexType>
</xs:element>
• ekvivalentní zápisy:
<img src="logo.gif" alt="Logo firmy"/>
<img src="logo.gif" alt="Logo firmy"
title="Bez titulku"/>
• chybné zápisy:
<img alt="Logo" title="Logo naší firmy"/>
<img src="logo.gif"/>
Komplexní typy
Copyright © 2001-2006 Jiří Kosek
XML schémata
35 / 56 (strana 49)
Jmenné prostory
Co to jsou jmenné prostory ........................................................ 51
Globální deklarace .................................................................... 53
Lokální deklarace ...................................................................... 54
Copyright © 2001-2006 Jiří Kosek
XML schémata
(strana 50)
Co to jsou jmenné prostory
• umožňují kvalifikovat elementy/atributy
• umožňují v jednom dokumentu kombinovat několik různých sad značek
(např. v XHTML dokumentu je obrázek v SVG a rovnice v MathML)
• jmenný prostor je identifikován pomocí URI adresy
• podle jmenného prostoru aplikace poznají, kterým částem XML
dokumentu rozumějí
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ukázka webové stránky
s vektorovým obrázkem</title>
</head>
<body>
<p>Zajímavý obrázek:</p>
<svg width="4in" height="3in"
xmlns="http://www.w3.org/2000/svg">
<desc>This is a blue circle with a red outline</desc>
<g>
<circle style="fill: blue; stroke: red" cx="200"
cy="200" r="100"/>
<text x=".5in" y="2in">Hello World</text>
</g>
</svg>
</body>
</html>
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ukázka webové stránky
s vektorovým obrázkem</title>
</head>
<body>
<p>Zajímavý obrázek:</p>
<svg:svg width="4in" height="3in"
xmlns:svg="http://www.w3.org/2000/svg">
<svg:desc>This is a blue circle with
a red outline</svg:desc>
<svg:g>
<svg:circle style="fill: blue; stroke: red" cx="200"
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
36 / 56 (strana 51)
Co to jsou jmenné prostory (Pokračování)
cy="200" r="100"/>
<svg:text x=".5in" y="2in">Hello World</svg:text>
</svg:g>
</svg:svg>
</body>
</html>
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
36 / 56 (strana 52)
Globální deklarace
• globální deklarace – jsou uvedené přímo pod xs:schema
• globální deklarace lze využívat z jiných schémat (xs:import, xs:include)
• jmenný prostor pro globální elementy/atributy se určuje pomocí
targetNamespace
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:cz-kosek:schemas:zamestnanci:v1.0">
• standardně do cílového jmenného prostoru patří jen globálně
deklarované elementy
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:x-kosek:schemas:pokus"
xmlns="urn:x-kosek:schemas:pokus">
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="b" type="xs:string"/>
<xs:element name="c" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<a xmlns="urn:x-kosek:schemas:pokus">
<b xmlns="">foo</b>
<c xmlns="">bar</c>
</a>
<p:a xmlns:p="urn:x-kosek:schemas:pokus">
<b>foo</b>
<c>bar</c>
</p:a>
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
37 / 56 (strana 53)
Lokální deklarace
• lokální deklarace jsou uvnitř globálních
• nelze je znovuvyužívat z jiných schémat
• u typů hovoříme o tzv. anonymních typech – nejsou pojmenované a
nejde se na ně odvolat
• u lokálních deklarací elementů/atributů můžeme pomocí atributu form
určit, zda mají patřit do cílového jmenného prostoru
<xs:element name="b" form="qualified" type="xs:string"/>
• jde nastavit i globálně pro celé schéma – elementFormDefault,
attributeFormDefault
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:x-kosek:schemas:pokus"
xmlns="urn:x-kosek:schemas:pokus"
elementFormDefault="qualified">
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="b" type="xs:string"/>
<xs:element name="c" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<a xmlns="urn:x-kosek:schemas:pokus">
<b>foo</b>
<c>bar</c>
</a>
<p:a xmlns:p="urn:x-kosek:schemas:pokus">
<p:b>foo</p:b>
<p:c>bar</p:c>
</p:a>
Jmenné prostory
Copyright © 2001-2006 Jiří Kosek
XML schémata
38 / 56 (strana 54)
Validace
Připojení schéma k dokumentu (Nepoužíváme vlastní jmenný
prostor) .................................................................................. 56
Připojení schéma k dokumentu (Používáme vlastní jmenný
prostor) .................................................................................. 57
Podpora schémat v parserech ..................................................... 58
Copyright © 2001-2006 Jiří Kosek
XML schémata
(strana 55)
Připojení schéma k dokumentu
Nepoužíváme vlastní jmenný prostor
• před validací musíme parseru sdělit, kde pro dokument najde jeho
schéma
• možnosti určení schématu:
• ruční výběr schématu
• automatická připojení schématu podle jmenného prostoru/jména
kořenového elementu/…
• odkaz na schéma je uveden přímo v dokumentu XML
Příklad 7. XML dokument – xsd/faktura.xml
<faktura xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="faktura.xsd"
…
</faktura>
Příklad 8. XML schéma – xsd/faktura.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="faktura">
...
Validace
Copyright © 2001-2006 Jiří Kosek
XML schémata
39 / 56 (strana 56)
Připojení schéma k dokumentu
Používáme vlastní jmenný prostor
• pro každý jmenný prostor můžeme určit, kde se pro něj najde schéma
• atribut xsi:schemaLocation obsahuje seznam uspořádaných dvojic jmenný
prostor a umístění schématu
Příklad 9. XML dokument – xsd/fakturans.xml
<faktura xmlns="urn:x-kosek:schemas:faktura:1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:x-kosek:schemas:faktura:1.0 fakturans.xsd">
…
</faktura>
nebo bez deklarace implicitního jmenného prostoru
<f:faktura xmlns:f="urn:x-kosek:schemas:faktura:1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:x-kosek:schemas:faktura:1.0 fakturans.xsd">
...
</f:faktura>
Příklad 10. XML schéma – xsd/fakturans.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:x-kosek:schemas:faktura:1.0"
xmlns="urn:x-kosek:schemas:faktura:1.0"
elementFormDefault="qualified">
<xsd:element name="faktura">
…
Validace
Copyright © 2001-2006 Jiří Kosek
XML schémata
40 / 56 (strana 57)
Podpora schémat v parserech
4
• Xerces
• součást projektu Apache
• open source projekt
• platforma: Java
• spuštění ve validačním režimu
xerces -v -s dokument.xml
• MSXML4, System.Xml
• autor: Microsoft
• platforma: Win32, .NET
5
• XSV
• autor: University of Edinburgh
• platforma: Python
6
• xmllint (součást libxml2)
• open source implementace v C dostupná pro Unix i Windows
• neúplná podpora datových typů
• xmllint --schema schema.xsd --noout dokument.xml
• … a mnoho dalších
• ukázka validace ve VS.NET, Xercesu, XML Spy
4
5
6
http://xml.apache.org/
http://www.w3.org/2001/03/webdata/xsv
http://xmlsoft.org/
Validace
Copyright © 2001-2006 Jiří Kosek
XML schémata
41 / 56 (strana 58)
Přístupy k návrhu schématu
Struktura schématu ..................................................................
Matrjóška ................................................................................
Salámová kolečka .....................................................................
Metoda slepého Benátčana ........................................................
Best practices pro návrh ............................................................
Copyright © 2001-2006 Jiří Kosek
60
61
62
63
65
XML schémata
(strana 59)
Struktura schématu
• schémata nabízejí mnoho různých možností pro popsání stejné struktury
XML
• můžeme je libovolně kombinovat
• v praxi je však dobré držet se jednotného a konzistentního přístupu
k tvorbě schématu
Příklad 11. Ukázkový dokument
<?xml version="1.0" encoding="UTF-8"?>
<zamestnanec>
<jmeno>Jan</jmeno>
<prijmeni>Novák</prijmeni>
<adresa>
<ulice>Dlouhá 2</ulice>
<město>Praha 1</město>
<psč>110 00</psč>
</adresa>
<plat>34500</plat>
</zamestnanec>
Přístupy k návrhu schématu
Copyright © 2001-2006 Jiří Kosek
XML schémata
42 / 56 (strana 60)
Matrjóška
• globální je jen jeden element
• špatné možnosti znovupoužití
• schéma je krátké a kompaktní
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="zamestnanec">
<xs:complexType>
<xs:sequence>
<xs:element name="jmeno" type="xs:string"/>
<xs:element name="prijmeni" type="xs:string"/>
<xs:element name="adresa">
<xs:complexType>
<xs:sequence>
<xs:element name="ulice" type="xs:string"/>
<xs:element name="město" type="xs:string"/>
<xs:element name="psč" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="plat" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Přístupy k návrhu schématu
Copyright © 2001-2006 Jiří Kosek
XML schémata
43 / 56 (strana 61)
Salámová kolečka
• všechny elementy jsou globální
• dohromady se vše složí pomocí odkazů
• dokument může začínat libovolným elementem
• všechny elementy lze znovupoužívat
• jeden element nemůže mít dva různé modely obsahu podle kontextu
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element
<xs:element
<xs:element
<xs:element
<xs:element
<xs:element
name="jmeno" type="xs:string"/>
name="prijmeni" type="xs:string"/>
name="ulice" type="xs:string"/>
name="město" type="xs:string"/>
name="psč" type="xs:string"/>
name="plat" type="xs:decimal"/>
<xs:element name="adresa">
<xs:complexType>
<xs:sequence>
<xs:element ref="ulice"/>
<xs:element ref="město"/>
<xs:element ref="psč"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="zamestnanec">
<xs:complexType>
<xs:sequence>
<xs:element ref="jmeno"/>
<xs:element ref="prijmeni"/>
<xs:element ref="adresa"/>
<xs:element ref="plat"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Přístupy k návrhu schématu
Copyright © 2001-2006 Jiří Kosek
XML schémata
44 / 56 (strana 62)
Metoda slepého Benátčana
• pro všechny elementy se definují typy
• elementy jsou definovány lokálně pomocí těchto typů
• spojuje výhody předchozích dvou přístupů
• nejupovídanější a nejpracnější
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="jmenoType">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="15"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="prijmeniType">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="20"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="uliceType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="městoType">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="psčType">
<xs:restriction base="xs:token">
<xs:pattern value="[0-9]{3} [0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="platType">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
Přístupy k návrhu schématu
Copyright © 2001-2006 Jiří Kosek
XML schémata
45 / 56 (strana 63)
Metoda slepého Benátčana (Pokračování)
<xs:complexType name="adresaType">
<xs:sequence>
<xs:element name="ulice" type="uliceType"/>
<xs:element name="město" type="městoType"/>
<xs:element name="psč" type="psčType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="zamestnanecType">
<xs:sequence>
<xs:element name="jmeno" type="jmenoType"/>
<xs:element name="prijmeni" type="prijmeniType"/>
<xs:element name="adresa" type="adresaType"></xs:element>
<xs:element name="plat" type="platType"/>
</xs:sequence>
</xs:complexType>
<xs:element name="zamestnanec" type="zamestnanecType"/>
</xs:schema>
Přístupy k návrhu schématu
Copyright © 2001-2006 Jiří Kosek
XML schémata
45 / 56 (strana 64)
„Best practices“ pro návrh
• každé schéma by mělo mít definováno vlastní cílový jmenný prostor
(targetNamespace)
• všechny elementy by měly patřit do tohoto jmenného prostoru
(elementFormDefault="qualified")
• nepoužívat standardní ani fixní hodnoty (default="…", fixed="…") protože
mění infoset
• konzistentní a srozumitelné názvy elementů/atributů
• moc krátké jsou nesrozumitelné, příliš dlouhé se špatně píší
• <cenaVýrobku kódMěny="USD">5.99</cenaVýrobku>
• jemnost/zrnitost značkování
• elementy × atributy
• atributy se nemohou opakovat
• atributy nelze dále strukturovat
• dnes se doporučuje do atributů ukládat pouze údaje, u kterých je
předem známá množina přípustných hodnot, případně se jedná o
typy jako číslo nebo datum
• obecné textové řetězce není vhodné ukládat do atributů, protože
v budoucnu může vzniknout požadavek na doplnění značkování (např.
Ruby anotace, změna směru textu ve vícejazyčném dokumentu)
• repozitory DTD/schémat – http://www.xml.org
Přístupy k návrhu schématu
Copyright © 2001-2006 Jiří Kosek
XML schémata
46 / 56 (strana 65)
Pokročilé vlastnosti
Práce s prázdnými hodnotami (NULL) ..........................................
Zajištění jedinečnosti hodnot ......................................................
Ukázka unikátního klíče .............................................................
Referenční integrita ..................................................................
Objektově orientované rysy .......................................................
Copyright © 2001-2006 Jiří Kosek
67
68
69
70
71
XML schémata
(strana 66)
Práce s prázdnými hodnotami (NULL)
• elementy, které mohou být prázdné, musíme takto definovat
<xs:element name="autor" nillable="true"
type="xs:string"/>
• autor je prázdný řetězec
<autor></autor>
<autor/>
• autor má hodnotu „NULL“
<autor xsi:nil="true"></autor>
<autor xsi:nil="true"/>
• nepřípustné použití
<autor xsi:nil="true">Novák</autor>
• nelze použít pro atributy, pouze pro elementy
Pokročilé vlastnosti
Copyright © 2001-2006 Jiří Kosek
XML schémata
47 / 56 (strana 67)
Zajištění jedinečnosti hodnot
• nad libovolnou množinou elementů a atributů lze definovat unikátní
klíč
• v jednom dokumentu XML můžeme mít několik klíčů
• definice klíče pomocí XPath výrazů
• typy klíčů
• xs:unique – zajistí unikátnost hodnot, ale hodnoty mohou chybět
• xs:key – zajistí unikátnost hodnot, hodnoty musí být vždy uvedeny
• xs:keyref – cizí klíč
Pokročilé vlastnosti
Copyright © 2001-2006 Jiří Kosek
XML schémata
48 / 56 (strana 68)
Ukázka unikátního klíče
Příklad 12. Osobní číslo je jedinečné
<zamestnanci>
<zamestnanec oc="1164">
<jmeno>Procházka Karel</jmeno>
<sef>2021</sef>
</zamestnanec>
<zamestnanec oc="1168">
<jmeno>Novotná Alena</jmeno>
<sef>2021</sef>
</zamestnanec>
<zamestnanec oc="1230">
<jmeno>Klíma Josef</jmeno>
<sef>1168</sef>
</zamestnanec>
<zamestnanec oc="1564">
<jmeno>Pinkas Josef</jmeno>
<sef>2021</sef>
</zamestnanec>
<zamestnanec oc="2021">
<jmeno>Kládová Adéla</jmeno>
</zamestnanec>
</zamestnanci>
...
<xs:element name="zamestnanci">
<xs:complexType>
<xs:sequence>
<xs:element ref="zamestnanec" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="oc_je_unikatni">
<xs:selector xpath="zamestnanec"/>
<xs:field xpath="@oc"/>
</xs:unique>
</xs:element>
...
Pokročilé vlastnosti
Copyright © 2001-2006 Jiří Kosek
XML schémata
49 / 56 (strana 69)
Referenční integrita
• definuje se jako cizí klíč, který musí ukazovat na nějaký existující klíč
• cizí klíč musí být definován na stejné nebo vyšší úrovni než klíč
Příklad 13. Šéf každého zaměstnance existuje
<xs:element name="zamestnanci">
<xs:complexType>
<xs:sequence>
<xs:element ref="zamestnanec" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="osobni_cislo">
<xs:selector xpath="zamestnanec"/>
<xs:field xpath="@oc"/>
</xs:key>
<xs:keyref name="sef_je_existujici_oc" refer="osobni_cislo">
<xs:selector xpath="zamestnanec"/>
<xs:field xpath="sef"/>
</xs:keyref>
</xs:element>
• xs:keyref může ukazovat i na xs:unique
Pokročilé vlastnosti
Copyright © 2001-2006 Jiří Kosek
XML schémata
50 / 56 (strana 70)
Objektově orientované rysy
• možnost odvozování (dědění) nových typů od již existujících
• substituční skupiny (podtřídy)
• abstraktní datové typy (nejde je použít v instanci)
• můžeme zablokovat další dědění typů
Pokročilé vlastnosti
Copyright © 2001-2006 Jiří Kosek
XML schémata
51 / 56 (strana 71)
Kombinování schémat
Kombinování schémat ...............................................................
RELAX NG + Schematron ..........................................................
WXS + Schematron ..................................................................
Validace komponovaných dokumentů ..........................................
Copyright © 2001-2006 Jiří Kosek
73
74
76
77
XML schémata
(strana 72)
Kombinování schémat
• každý schémový jazyk má trošku jiné vyjadřovací schopnosti
• pro důkladnou validaci je potřeba několik schémat zkombinovat
• nejčastější kombinace
• Relax NG + Schematron
• W3C XML Schema + Schematron
• validace komponovaných dokumentů
Kombinování schémat
Copyright © 2001-2006 Jiří Kosek
XML schémata
52 / 56 (strana 73)
RELAX NG + Schematron
<?xml version="1.0" encoding="utf-8"?>
<element xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns:sch="http://www.ascc.net/xml/schematron"
name="zamestnanci">
<sch:pattern name="Máme dost na vyplacení platů">
<sch:rule context="zamestnanci">
<sch:report test="sum(zamestnanec/plat) &gt; 50000">Součet platů ►
nemůže být větší než 50.000,-.
Současný součet je <sch:value-of ►
select="sum(zamestnanec/plat)"/></sch:report>
</sch:rule>
</sch:pattern>
<oneOrMore>
<element name="zamestnanec">
<attribute name="id">
<data type="int"/>
</attribute>
<element name="jmeno">
<data type="string"/>
</element>
<element name="prijmeni">
<data type="string"/>
</element>
<oneOrMore>
<element name="email">
<data type="string"/>
</element>
</oneOrMore>
<optional>
<element name="plat">
<data type="decimal"/>
</element>
</optional>
<element name="narozen">
<data type="date"/>
</element>
<sch:pattern name="Duplicita osobních čísel">
<sch:rule context="zamestnanec">
<sch:report test="count(../zamestnanec[@id = current()/@id]) ►
&gt; 1">Duplicitiní osobní číslo
<sch:value-of select="@id"/> u elementu ►
Kombinování schémat
Copyright © 2001-2006 Jiří Kosek
XML schémata
53 / 56 (strana 74)
RELAX NG + Schematron (Pokračování)
<sch:name/>.</sch:report>
</sch:rule>
</sch:pattern>
</element>
</oneOrMore>
</element>
Kombinování schémat
Copyright © 2001-2006 Jiří Kosek
XML schémata
53 / 56 (strana 75)
WXS + Schematron
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sch="http://www.ascc.net/xml/schematron">
<xs:element name="zamestnanci">
<xs:annotation>
<xs:appinfo>
<sch:pattern name="Máme dost na vyplacení platů">
<sch:rule context="zamestnanci">
<sch:report test="sum(zamestnanec/plat) &gt; 50000">Součet ►
platů nemůže být větší než 50.000,-.
Současný součet je <sch:value-of ►
select="sum(zamestnanec/plat)"/></sch:report>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="zamestnanec"
maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="jmeno" type="xs:string"/>
<xs:element name="prijmeni" type="xs:string"/>
<xs:element name="email" type="xs:string"
maxOccurs="unbounded"/>
<xs:element name="plat" type="xs:decimal"
minOccurs="0"/>
<xs:element name="narozen" type="xs:date"/>
</xs:sequence>
<xs:attribute name="id" type="xs:int"
use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Kombinování schémat
Copyright © 2001-2006 Jiří Kosek
XML schémata
54 / 56 (strana 76)
Validace komponovaných dokumentů
• dokument se skládá z několika různých sad značek
• každá sada je ve vlastním jmenném prostoru (např. XHTML a SVG)
• NVDL (Namespace-based Validation Dispatching Language) – jazyk
pro tvorbu meta-schémat popisujících validaci komponovaných
dokumentů
<rules xmlns="http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0">
<namespace ns="http://www.w3.org/1999/xhtml">
<validate schema="xhtml.xsd"/>
</namespace>
<namespace ns="http://www.w3.org/2000/svg">
<validate schema="svg.rng"/>
</namespace>
</rules>
Kombinování schémat
Copyright © 2001-2006 Jiří Kosek
XML schémata
55 / 56 (strana 77)
Další zdroje informací
Odkazy ................................................................................... 79
Copyright © 2001-2006 Jiří Kosek
XML schémata
(strana 78)
Odkazy
7
• stránky W3C – specifikace a další odkazy
8
• XSV
9
• Topologi Schema Validator
10
• Trang
11
• MSV
– nástroj na konverzi mezi schématy
– validátor s podporou mnoha různých schémových jazyků
12
– XML editor včetně grafického editoru schémat
13
– XML editor včetně grafického editoru schémat
• oXygen
• XmlSpy
14
• XML Schema and RelaxNG Tutorial
15
• RELAX NG
– volně dostupná kniha od Erica van der Vlista
16
• XML schémata
– tutoriál v češtině
7
http://www.w3.org/XML/Schema
http://www.ltg.ed.ac.uk/~ht/xsv-status.html
9
http://www.topologi.com/products/validator/
10
http://www.thaiopensource.com/relaxng/trang.html
11
https://msv.dev.java.net/
12
http://www.oxygenxml.com/
13
http://www.altova.com/products_ide.html
14
http://zvon.org/xxl/XMLSchemaTutorial/Output/index.html
15
http://books.xmlschemata.org/relaxng/
16
http://www.kosek.cz/xml/schema/
8
Další zdroje informací
Copyright © 2001-2006 Jiří Kosek
XML schémata
56 / 56 (strana 79)

Podobné dokumenty

API pro práci s XML

API pro práci s XML Úvod .................................................................................. 17 Příklad schématu ................................................................. 18 Ukázka rozhraní vyge...

Více

XML schémata

XML schémata XML umožňuje vytvářet dokumenty s libovolně pojmenovanými a vnořenými elementy

Více

PDF pro tisk

PDF pro tisk 1.2. Historický vývoj jazyků pro popis schématu dokumentu .................................................. 2 1.3. Srovnání nejpoužívanějších jazyků pro popis schématu dokumentu .....................

Více

druhá testovací příloha

druhá testovací příloha 1.3. Srovnání nejpoužívanějších jazyků pro popis schématu dokumentu .................................. 3 1.4. Jaký jazyk pro popis schématu dokumentu použít ...........................................

Více

Zpráva o výsledku přezkoumání hospodaření za účetní období roku

Zpráva o výsledku přezkoumání hospodaření za účetní období roku 31.12.2*1S, n* *iur' pifsluinf*h *{tu *gt*ve tsnnvy a navazuji na z*statky majetku a zi*vazk* vykazovan* v RozvArt ke 3i .12.tt't4 n**dtei*izfint*tky vyka:*vnn* v ROfrVAZt k 1'1'2U'l$ udetni*tvi n ...

Více

Implementace standardu Sensor Observation Service

Implementace standardu Sensor Observation Service – elementy, datové typy elementu, samotný obsah • DTD – jednoduché X nemá dat. typy • W3C XML Schema – syntaxe XML, má dat. typy X „ukecané“ • RelaxNG – XML syntaxe, sjednocený přístup k att a elem...

Více

Standard elektronické fakturace

Standard elektronické fakturace a) Zaslání podkladů k platbě a doručení e-faktur a e-dokumentů do EB (výstavce → banka) b) Potvrzení o přijetí e-faktur a e-dokumentů do EB (banka → výstavce)

Více

DatoveRozhrani_ISORRVD-EVAL_091210

DatoveRozhrani_ISORRVD-EVAL_091210  PredpokladanyOdjezd – datum a čas požadovaného odjezdu (alternativa DelkaPobytu)  Poradi – pořadí stanice v čísle vlakové trasy (1 – x po kolikáté stejná stanice)  Stanice – stanice odkud změna...

Více

Informace o stahovacích službách pro INSPIRE téma Zeměpisná

Informace o stahovacích službách pro INSPIRE téma Zeměpisná Služba WFS pro INSPIRE harmonizovanou sadu Zeměpisná jména (GN) podporuje funkci describeFeatureType. Pomocí této služby lze získat XSD schéma pro obsažené vrstvy. Dle standardu OGC pro službu WFS ...

Více