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