XML – ćwiczenia 4: XML Schema – typy proste

Przypominamy, że standard XML Schema zdefiniowany jest w trzech rekomendacjach:

Typy proste w XML Schema

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ę.

Typy wbudowane

XML Schema zawiera bogaty zestaw typów wbudowanych, do których należą m.in. typy liczbowe oraz typy związane z datą i czasem.

Własne typy proste

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):

  1. poprzez zawężenie innego typu prostego (restriction),
  2. jako sumę innych typów prostych (union),
  3. jako listę wartości innego typu prostego (list).

Przykładowe definicje typów prostych: simpletype1.xsd, simpletype2.xsd.

Zawężanie typów prostych

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.

Przykład 1.

<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.

Suma typów prostych

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.

Przykład 2.

<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>

Listy

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.

Przykład 3.

<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>

Zadanie 1.

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:

  • nazwa firmy, imię i nazwisko,
  • wiek lub data urodzenia,
  • kod pocztowy,
  • numer telefonu z rodzajem (prywatny / służbowy, stacjonarny / komórka / internetowy(?)).

Specify simple types for visit cards elements and attributes.

Zadanie 2.

Zdefiniuj następujące typy proste:

  1. napis o długości od 1 do 20,
  2. napis o długości od 1 do 20 lub od 30 do 40,
  3. lista od 1 do 3 dat.

Define the following simple types:

  1. string of length from 1 to 20,
  2. string of length from 1 to 20 or from 30 to 40,
  3. list of 1 to 3 dates.

Przestrzenie nazw w XML Schema

Docelowa przestrzeń nazw

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.

Prefiks dla lokalnych 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.

Deklaracja zgodności ze schematem

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.

Zadanie 3.

  1. Nadaj schematowi dla wizytówek docelową przestrzeń nazw.
  2. Dla elementów nazwy niech będą kwalifikowane, a dla atrybutów niekwalifikowane.
  3. Uaktualnij dokument z wizytówką i zwaliduj go.
  1. Give the visit cards schema a target namespace.
  2. Make element names qualified and attribute names unqualified.
  3. Update the document (visit card) and validate it.

Zadanie 4.

  1. Stwórz prosty schemat dla "wizytowników" lub "książek adresowych" – dokumentów zawierających sekwencje wizytówek.
  2. Niech docelowa przestrzeń nazw tego schematu będze różna od przestrzeni nazw wizytówek.
  3. Stwórz dokument zgodny z tym schematem i zawierający wizytówkę. Zwaliduj go.
  1. Create a simple schema for documents containing a sequence of visit cards.
  2. Let the target namespace of this schema be different from visit cards namespace.
  3. Create a document according to this schema, contanining a visit card. Validate the document.

Valid XHTML 1.1Valid CSS