Przypominamy, że standard XML Schema zdefiniowany jest w trzech rekomendacjach:
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, simpletype2.xsd.
Typ prosty (wbudowany lub zdefiniowany) 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="short_text"> <xs:restriction base="xs:string"> <xs:length value="50"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="NumerLottoTyp"> <xs:restriction base="xs:integer"> <xs:minInclusive value="1" /> <xs:maxInclusive value="49" /> </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ść należy do typu będącego sumą, jeśli należy do któregoś ze składników sumy.
<xs:simpleType name="TNumericSize"> <xs:restriction base="xs:integer"> <xs:minInclusive value="2" /> <xs:maxInclusive value="18" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="TLetterSize"> <xs:restriction base="xs:token"> <xs:enumeration value="S" /> <xs:enumeration value="M" /> <xs:enumeration value="L" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="TSize"> <xs:union memberTypes=" TNumericSize TLetterSize" /> </xs:simpleType>
<xs:simpleType name="TSize2"> <xs:union> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="2" /> <xs:maxInclusive value="18" /> </xs:restriction> </xs:simpleType> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="S" /> <xs:enumeration value="M" /> <xs:enumeration value="L" /> </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="NumeryLottoTyp"> <xs:list itemType="NumerLottoTyp" /> </xs:simpleType> <xs:simpleType name="KuponLottoTyp"> <xs:restriction base="NumeryLottoTyp"> <xs:length value="6" /> </xs:restriction> </xs:simpleType>
<xs:simpleType name="KuponLottoTyp_inaczej"> <xs:restriction> <xs:simpleType> <xs:list> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="1" /> <xs:maxInclusive value="49" /> </xs:restriction> </xs:simpleType> </xs:list> </xs:simpleType> <xs:length value="6" /> </xs:restriction> </xs:simpleType>
Do schematu dla wizytówek (z ubiegłych zajęć) dodaj precyzyjne definicje typów prostych. Jeśli jeszcze nie ma, dodaj do wizytówki takie informacje:
Specify simple types for visit cards elements and attributes.
Zdefiniuj następujące typy proste:
Define the following simple types:
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 nazwy nie należą do żadnej przestrzeni nazw.
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. Jeśli dana przestrzeń nazw jest w dokumencie domyślna, w obu przypadkach nazwy elementów 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ę schematów definiujących elementy i atrybuty z różnych przestrzeni nazw (dla każdej przestrzeni nazw jeden schemat); wartością atrybutu jest lista par (wartości rozdzielone białymi znakami):
noNamespaceSchemaLocation
– podaje lokalizację (URL) schematu definiującego
elementy i atrybuty nie należące do przestrzeni nazw.