Przypominamy, że standard XML Schema zdefiniowany jest w trzech rekomendacjach:
Rzeczywiście model zawartości zdefiniowany w XML Schema musi być deterministyczny. Problem ten jest opisany w rekomendacjach w następujących miejscach:
Intuicyjnie determinizm polega na tym, że dla każdego dokumentu podczas czytania dokumentu po napotkaniu kolejnego elementu jesteśmy w stanie jednoznacznie wskazać pozycję w schemacie (DTD), która temu elementowi odpowiada, bez analizowania kolejnych elementów.
Wiele modeli zapisanych niedeterministycznie daje się zapisać deterministycznie. Na przykład (notacja z DTD):
(a,b)|(a,c)
można zapisać jako a,(b|c)
,Istnieją jednak modele zawartości, których nie da się wyrazić deterministycznie (w tym sensie), np.:
(a,b)*,a?
, (aa)*|(aaa)*
z zadania z poprzednich zajęć (tak nam się wydaje).Przepraszam za to zadanie, wprowadziło niepotrzebne zamieszanie.
XML Schema pozwala na bardzo precyzyjne definiowanie typów prostych, czyli zawartości tekstowej elementów i atrybutów. Dzięki temu walidując dokument sprawdzamy nie tylko jego strukturę na poziomie drzewa, ale także poprawność zapisanych w nim danych. Ma to szczególne znaczenie przy zastosowaniach XML w programowaniu rozproszonym, bazach danych itp.
Typy proste mogą być także interpretowane przez procesory XPath i XSLT (>= 2.0) oraz XQuery. Fakt, że jakiś element / atrybut posiada jakiś typ prosty może mieć wpływ na porównywanie i sortowanie wartości oraz na arytmetykę.
XML Schema zawiera bogaty zestaw typów wbudowanych, do których należą m.in. typy liczbowe oraz typy związane z datą i czasem.
Istnieje też możliwość definiowania własnych typów prostych (nazwanych lub anonimowych).
Służy do tego element schematu simpleType
.
Typy proste można tworzyć zasadniczo na trzy sposoby (odpowiadają im podelementy elementu simpleType
):
restriction
),union
),list
).Przykładowe definicje typów prostych: simpletype1.xsd.
Typ prosty (wbudowany, zdefiniowany lub anonimowy) można zawęzić, tworząc nowy typ. Zawężanie odbywa się względem aspektów facets takich jak długość, minimalna i maksymalna wartość liczby, wyrażenie regularne. Pełna lista tutaj.
<xs:simpleType name="krotki_napis"> <xs:restriction base="xs:string"> <xs:length value="50"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="bajt"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxExclusive value="256"/> </xs:restriction> </xs:simpleType>
Zdarza się, że pustej konstrukcji restriction
używa się sztucznie w miejscach,
gdzie wymagany jest element simpleType
a chcemy podać typ zdefiniowany lub wbudowany.
Typy proste można zsumować, tworząc nowy typ. Wartość jest zgodna z typem będącym sumą, jeśli jest zgodna w którymś składnikiem sumy.
<xs:simpleType name="bajt_lub_bajt_ujemny"> <xs:union> <xs:simpleType> <xs:restriction base="bajt"/> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:maxInclusive value="0"/> <xs:minExclusive value="-256"/> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType>
Typ prosty T może być zdefiniowany jako lista w oparciu o typ atomowy A. Oznacza to, że poprawną wartością typu T jest lista (także pusta) wartości, które należą do typu A. Poszczególne wartości rozdzielone są białymi znakami. Typ A musi być przy tym atomowy, tzn. sam nie może być listą (ani chyba sumą – to do sprawdzenia :).
Aspekt length
dla typu będącego listą dotyczy liczby elementów na liście, a nie długości napisu.
<xs:simpleType name="lista_bajtow"> <xs:list itemType="bajt"/> </xs:simpleType> <xs:simpleType name="lista_1_10_bajtow"> <xs:restriction base="lista_bajtow"> <xs:minLength value="1"/> <xs:maxLength value="10"/> </xs:restriction> </xs:simpleType>
Do schematu dla wizytówek (z ubiegłych zajęć) dodaj precyzyjne definicje typów prostych:
Zdefiniuj następujące typy proste:
Standard XML Schema jest związany ze standardem Namespaces in XML. Elementy i atrybuty, a także typy nazwane,
zdefiniowane w schemacie znajdują się w przestrzeni nazw określonej przez atrybut targetNamespace
elementu schema
. Domyślnie jest to przestrzeń nazw z pustym identyfikatorem (jak w dotychczasowych przykładach).
Jak wiemy z poprzednich zajęć, niektóre (a nawet prawie wszystkie) elementy i atrybuty w schemacie mogą być zdefiniowane lokalnie. Autor schematu może zdecydować, czy w dokumentach elementy / atrybuty te muszą występować z prefiksem przestrzeni nazw, czy też nie. Oczywiście jeśli dana przestrzeń nazw jest w dokumencie domyślna, w obu przypadkach nazwy nie muszą posiadać prefiksu.
Służą do tego atrybuty (ich wartościami mogą być qualified
lub unqualified
):
elementFormDefault
i attributeFormDefault
– w elemencie schema
,form
– w lokalnej definicji elementu lub atrybutu.Przykłady można zobaczyć w rekomendacji.
W dokumencie można zadeklarować, że jest on instancją danego schematu. Służą do tego specjalne atrybuty
dodane do elementu głównego lub podelementów. Atrybuty należą do przestrzeni nazw http://www.w3.org/2001/XMLSchema-instance
.
schemaLocation
– podaje lokalizację schematu definiującego elementy i atrybuty z podanej przestrzeni nazw; wartością atrybutu są dwie wartości rozdzielone białymi znakami:
noNamespaceSchemaLocation
– podaje lokalizację (URL) schematu definiującego
elementy i atrybuty z przestrzeni nazw o pustym identyfikatorze.
Umieść elementy i atrybuty definiowane w schemacie dla wizytówek w przestrzeni nazw
http://www.mimuw.edu.pl/TWÓJLOGIN/wizytowki
.
Dla elementów nazwy niech będą kwalifikowane, a dla atrybutów niekwalifikowane.
Zdefiniuj schemat dla prostych dokumentów tekstowych. Należy zdefiniować takie elementy jak tytuł, rozdział, akapit, lista, element listy, wyróżnienie. Użyj widoku graficznego XML Spy.
Dla elementów nazwy niech będą kwalifikowane, a dla atrybutów niekwalifikowane.
Umieść elementy i atrybuty w przestrzeni nazw
http://www.mimuw.edu.pl/TWÓJLOGIN/tekstowy
.
Stwórz dokument, w którym będą zarówno elementy dokumentu tekstowego, jak i wizytówki (np. artykuł z wizytówką autora).
Dodaj atrybuty - deklaracje zgodności ze schematami. Sprawdź, czy się waliduje.