--- marp: true theme: default paginate: true size: 16:9 style: | section { font-size: 24px; } section h1 { color: #1a5276; } section h2 { color: #2980b9; } section table { font-size: 20px; } section small { font-size: 18px; } --- # Wykład 7 ## XML Schema — typy danych i modularyzacja **Systemy Zarządzania Treścią** Politechnika Poznańska --- # Część 1 ## Wbudowane typy proste --- ## Wbudowane typy proste — napisy XML Schema definiuje **44 wbudowane typy proste**. Oto wybrane typy napisowe: | Typ | Opis | |---|---| | **string** | Napis — dowolny ciąg znaków | | **normalizedString** | Napis, w którym każdy biały znak jest zastępowany przez spację | | **token** | Napis, w którym ciągi białych znaków są zastępowane jedną spacją, a białe znaki na końcach usuwane | | **QName** | Nazwa kwalifikowana (z prefiksem) | | **NCName** | Nazwa bez dwukropka | | **base64Binary** | Dane binarne w kodowaniu Base64 | | **hexBinary** | Dane binarne zapisane szesnastkowo | ### Różnice między typami napisowymi | Typ | Przetwarzanie białych znaków | |---|---| | `string` | Zachowuje wszystkie białe znaki | | `normalizedString` | Zastępuje każdy biały znak spacją | | `token` | Normalizuje i usuwa nadmiarowe spacje | --- ## Wbudowane typy proste — wartości | Typ | Poprawne wartości | |---|---| | **decimal** | `12.3`, `+000012.300` | | **float, double** | `+24.3e-3`, `12`, `NaN`, `-INF` | | **QName** | `os:osoba`, `osoba` | | **date** | `1968-04-02`, `1968-04-02-05:00`, `1968-04-02Z`, `-0045-02-02` | | **time** | `13:20:00.887`, `13:30:00-05:00` | | **dateTime** | `1968-04-02T13:20:00.887` | | **gYearMonth** | `1968-04` | | **gMonthDay** | `--04-02` | | **duration** | `P2Y6M5DT12H35M30S` | ### Uwagi - Typ `date` obsługuje strefy czasowe (sufiks `Z` lub przesunięcie), - `duration` reprezentuje okres czasu w notacji ISO 8601, - `NaN` i `-INF` to wartości specjalne typów zmiennoprzecinkowych. --- # Część 2 ## Wyprowadzanie typów prostych --- ## Wyprowadzanie typów XML Schema pozwala tworzyć **nowe typy** na bazie typów istniejących: ### Wyprowadzanie typów prostych - **Ograniczanie** (restriction), - **Tworzenie list** (list), - **Tworzenie unii** (union). ### Wyprowadzanie typów złożonych - **Ograniczanie** (restriction), - **Rozszerzanie** (extension): - typów prostych, - typów złożonych. > Wyprowadzanie typów to fundament rozszerzalności XML Schema — pozwala budować hierarchie typów. --- ## Ograniczanie typów prostych — aspekty (facets) Ograniczanie typu prostego odbywa się przez tzw. **aspekty** (ang. *facets*): | Aspekt | Znaczenie | |---|---| | `minExclusive`, `minInclusive` | Dolna granica (wykluczająca/włączająca) | | `maxExclusive`, `maxInclusive` | Górna granica | | `length`, `minLength`, `maxLength` | Długość napisu | | `totalDigits`, `fractionDigits` | Liczba cyfr (łącznie/po przecinku) | | `enumeration` | Wyliczenie dopuszczalnych wartości | | `pattern` | Wzorzec (wyrażenie regularne) | | `whiteSpace` | Sposób przetwarzania białych znaków | ### Zasada Tylko **`pattern` i `enumeration`** można użyć wielokrotnie w jednej definicji typu. --- ## Ograniczanie typów prostych — przykłady ### Ograniczenie zakresu ```xml ``` ### Ograniczenie wyliczeniowe ```xml ``` ### Ograniczenie wzorcem (wiele wzorców) ```xml ``` --- ## Zasada podzbioru wartości **Przestrzeń wartości typu wyprowadzonego musi być podzbiorem przestrzeni wartości typu bazowego.** Typy wbudowane mają określone aspekty, np. typ `byte`: - `minInclusive: -128`, - `maxInclusive: 127`. ### Przykład niepoprawnego wyprowadzenia ```xml ``` > Błąd: zakres `-256..255` **wykracza poza** przestrzeń wartości typu `byte` (`-128..127`). Ograniczenie może tylko zawężać, nie rozszerzać. --- ## Aspekt whiteSpace Aspekt `whiteSpace` kontroluje sposób przetwarzania białych znaków: | Wartość | Zachowanie | |---|---| | **preserve** | Wszystkie białe znaki pozostawiane bez zmian | | **replace** | Każdy biały znak zastępowany spacją | | **collapse** | Białe znaki zastępowane spacją, ciągi spacji → jedna spacja, spacje na końcach usuwane | ### Hierarchia `preserve` → `replace` → `collapse` to coraz silniejsza normalizacja. Typ `string` używa `preserve`, `normalizedString` — `replace`, a `token` — `collapse`. --- ## Tworzenie list Typ listowy reprezentuje **ciąg wartości oddzielonych spacjami**: ```xml ``` ### Opis - `NumeryLottoTyp` to lista wartości typu `NumerLottoTyp`, - `KuponLottoTyp` ogranicza listę do dokładnie 6 elementów. > Lista jest typem prostym — jej wartością jest napis złożony z elementów rozdzielonych spacjami. --- ## Tworzenie list — forma zagnieżdżona Ten sam typ można zdefiniować **bez nazw pośrednich**: ```xml ``` > Forma zagnieżdżona jest mniej czytelna, ale pozwala uniknąć definiowania typów pomocniczych, gdy są używane tylko raz. --- ## Tworzenie unii Typ unijny pozwala, aby wartość należała do **jednego z kilku typów**: ```xml ``` ### Znaczenie Typ `RozmiarTyp` akceptuje **albo liczbę 2–18, albo literę S/M/L**. --- ## Tworzenie unii — forma zagnieżdżona ```xml ``` > Unia jest szczególnie użyteczna, gdy ta sama informacja może być wyrażona w różnych formatach. --- # Część 3 ## Wyprowadzanie typów złożonych --- ## Rozszerzanie typów Rozszerzanie pozwala tworzyć typy **bogatsze** niż typ bazowy. Wartości typu bazowego nie muszą być poprawnymi wartościami typu wyprowadzonego. ### Rodzaje rozszerzania - **Rozszerzanie zawartości prostej** — dodawanie atrybutów do typu prostego lub złożonego o zawartości prostej, - **Rozszerzanie zawartości złożonej** — dodawanie dodatkowych elementów i/lub atrybutów; elementy dodawane w rozszerzeniu **występują zawsze na końcu**, po elementach typu bazowego. --- ## Rozszerzanie zawartości prostej ```xml ``` ### Opis - `MasaTyp` — zawartość prosta (decimal) + atrybut `jm`, - `MasaNiedokładnaTyp` — rozszerza `MasaTyp` o atrybut `dokładność`. > Rozszerzanie zawartości prostej = dodawanie atrybutów, przy zachowaniu tej samej treści tekstowej. --- ## Rozszerzanie zawartości złożonej ```xml ``` ### Opis - `OsobaZDokumentemTyp` zawiera elementy `imie` i `nazwisko` (z typu bazowego) **oraz** wybór `dowód-os`/`paszport`, - Elementy dodane w rozszerzeniu występują **po** elementach typu bazowego. --- ## Ograniczanie typów złożonych Ograniczanie typu złożonego jest możliwe tylko, gdy przestrzeń wartości typu wyprowadzonego jest **podzbiorem** przestrzeni wartości typu bazowego. ### Dozwolone operacje | Operacja | Opis | |---|---| | **Ograniczenie zawartości prostej** | Tak jak dla typu prostego | | **Ograniczenie atrybutu** | Ograniczenie typu, zmiana opcjonalnego na required/prohibited, dodanie/zmiana/usunięcie wartości domyślnej, dodanie wartości ustalonej | | **Ograniczenie modelu zawartości** | Ściślejsze `minOccurs`/`maxOccurs`, usunięcie elementów opcjonalnych, wybór podzbioru w `choice`, ograniczenie typów podelementów | --- ## Ograniczanie zawartości prostej i atrybutów ```xml ``` ### Analiza - Zakres wartości zawężony do `0..50`, - Atrybut `dokładność` **zabroniony** (`prohibited`), - Atrybut `jm` **ustalony** na `kg` (`fixed`). --- ## Ograniczanie zawartości złożonej ```xml ``` ### Analiza - Element `a`: zawężenie z `3..7` do `4..6`, - Element `b`: **usunięty** (był opcjonalny), - Element `c`: zachowany. --- # Część 4 ## Modularyzacja schematów --- ## Inne metody modularyzacji schematów Poza wyprowadzaniem typów, XML Schema oferuje mechanizmy **modularyzacji**: | Mechanizm | Opis | |---|---| | **Nazwane grupy modeli** | Grupy elementów do wielokrotnego wykorzystania | | **Grupy atrybutów** | Grupy atrybutów do wielokrotnego wykorzystania | | **Grupy zamienne** | Elementy, które mogą się wzajemnie zastępować | > Modularyzacja pozwala unikać powtórzeń i ułatwia utrzymanie schematu. --- ## Grupy do wielokrotnego wykorzystania ```xml ``` ### Działanie - Grupa `ImięNazwisko` i grupa `Biurokracja` definiowane raz, - Używane wielokrotnie przez `ref`. --- ## Grupy zamienne (substitution groups) Grupy zamienne pozwalają, aby jeden element mógł być **zastąpiony innym**: ```xml ``` ### Egzemplarz ```xml ... ... ... ... ``` > Elementy `komputer` i `ubranie` mogą wystąpić wszędzie tam, gdzie schemat oczekuje `produkt`. --- ## Więzy integralności Więzy integralności (*identity constraints*) to mechanizm wymuszania unikatowości i referencji: | Więź | Opis | |---|---| | **unique** | Wartości w zakresie muszą być unikatowe | | **key** | Wartości unikatowe i nie mogą być puste | | **keyref** | Odwołanie do wartości wskazanego klucza | ### Zalety w porównaniu z atrybutami ID–IDREF - można tworzyć wiele niezależnych ograniczeń, - odwołanie wskazuje **konkretny klucz**, - więzy mogą dotyczyć **kombinacji wartości**, - więzy mogą dotyczyć **zawartości elementów** (nie tylko atrybutów). --- ## Więzy integralności — przykład ```xml ``` ### Analiza - `unique` — pary (`@nr`, `rok`) faktur muszą być unikatowe, - `key` — `numer` zamówienia jest kluczem, - `keyref` — odwołanie faktury do zamówienia musi wskazywać istniejący klucz. --- ## Podsumowanie | Temat | Kluczowe wnioski | |---|---| | **Typy wbudowane** | 44 typy proste: napisy, liczby, daty, binarne | | **Aspekty (facets)** | minInclusive, maxInclusive, enumeration, pattern, whiteSpace itd. | | **Zasada podzbioru** | Typ wyprowadzony ⊆ typ bazowy | | **Listy** | Ciąg wartości rozdzielonych spacjami | | **Unie** | Wartość jednego z kilku typów | | **Rozszerzanie** | Dodawanie atrybutów (proste) lub elementów (złożone) | | **Ograniczanie** | Zawężanie wartości, atrybutów i modelu zawartości | | **Grupy** | Nazwane grupy modeli i atrybutów, grupy zamienne | | **Więzy integralności** | unique, key, keyref — z selektorem i polem XPath | --- # Dziękuję za uwagę **Systemy Zarządzania Treścią** Politechnika Poznańska