---
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 6
## XML Schema — przestrzenie nazw
**Systemy Zarządzania Treścią**
Politechnika Poznańska
---
# Część 1
## Deklaracje globalne i lokalne. Elementy vs atrybuty
---
## Globalne i lokalne deklaracje elementów i atrybutów
W XML Schema deklaracje elementów i atrybutów mogą być **globalne** (na najwyższym poziomie schematu) lub **lokalne** (wewnątrz definicji typu).
### Deklaracje lokalne
```xml
```
Elementy `imie` i `nazwisko` oraz atrybut `NIP` są zadeklarowane **lokalnie** — wewnątrz typu `OsobaTyp`.
### Deklaracje globalne i odwołania
```xml
```
Deklaracje globalne są **odwoływane** przez atrybut `ref`.
---
## Elementy czy atrybuty?
Decyzja, czy daną informację modelować jako **element** czy **atrybut**, jest fundamentalną decyzją projektową.
### Informacje modelowane zwykle w elementach
| Kategoria | Przykłady |
|---|---|
| **Zawartość** | Elementy semantyczne: nazwisko, nazwa leku, adres |
| **Struktura** | Rozdział, akapit, tytuł, lista |
| **Wyszukiwanie** | Termin do indeksu, glosariusza, elementy dedykowane |
| **Odesłania** | Hiperlinki, noty, przypisy |
### Informacje modelowane zwykle w atrybutach
| Kategoria | Przykłady |
|---|---|
| **Metainformacje** | Jednostka miary, waluta, język, priorytet |
| **Identyfikatory** | Identyfikatory wartości i odwołania do nich |
---
## Elementy czy atrybuty? — zalety
### Zalety elementów
- mogą zawierać inne elementy i atrybuty,
- mogą się powtarzać,
- można bezpiecznie rozszerzać ich model zawartości (np. dodając atrybuty),
- można dokładnie sterować sposobem ich występowania (kolejnością, liczbą wystąpień).
### Zalety atrybutów
- są bardziej zwięzłe,
- mogą być automatycznie dodawane do elementów, jeśli mają wartości domyślne.
> Reguła praktyczna: **treść i struktura → elementy; metadane i identyfikatory → atrybuty**.
---
## Wartości domyślne i ustalone
XML Schema pozwala definiować wartości **domyślne** (`default`) i **ustalone** (`fixed`):
```xml
```
### Działanie
| Przed przetworzeniem | Po przetworzeniu |
|---|---|
| `` | `5` |
| `3` | `3` |
| `20` | `20` |
| `20` | `20` |
> **default** — uzupełnia brakującą wartość; **fixed** — narzuca wartość, której nie można zmienić.
---
# Część 2
## Przestrzenie nazw
---
## Przestrzenie nazw — problem i rozwiązanie
### Problem
Ta sama nazwa (np. `NIP`) może oznaczać **dwa różne byty** w różnych dokumentach — a dokumenty te są powiązane (wspólnie przetwarzane, jeden zanurzony w drugim).

### Rozwiązanie: przestrzeń nazw (namespace)
**Przestrzeń nazw** to grupa nazw oddzielona (składniowo i semantycznie) od innych nazw.
### Status standardu
| Aspekt | Informacja |
|---|---|
| **Rekomendacja W3C** | 14 stycznia 1999 |
| **XML 1.0 (w tym DTD)** | Nie wspiera przestrzeni nazw |
| **Nowsze standardy** | XML Schema, XSL, XLink wspierają przestrzenie nazw |
---
## Nazwy przestrzeni nazw
Przestrzenie nazw identyfikowane są przez **URI**:
### Przykłady
- `http://www.w3.org/XSLT/Transform/1.0`
- `http://szz.mimuw.edu.pl/osoby`
- `urn:szz:mimuw`
### Właściwości nazw przestrzeni nazw
| Właściwość | Opis |
|---|---|
| **Nie muszą wskazywać zasobów** | Nie muszą prowadzić do konkretnych dokumentów |
| **Unikatowe identyfikatory** | Pełnią funkcję identyfikatorów |
| **Porównywanie napisów** | Porównywane jako napisy — istotna wielkość liter |
### Wykorzystanie w XML
- odwzorowanie na kilkuznakowy **prefiks**,
- poprzedzanie nazw prefiksem.
---
## Użycie przestrzeni nazw w XML
```xml
Jan
Kowalski
123-456-78-90
To jest bardzo fajny facet!
Business Consulting
987-654-32-10
```
### Zasada
Atrybut `xmlns:prefiks="URI"` deklaruje prefiks, którym poprzedzane są nazwy należące do danej przestrzeni.
---
## Domyślna przestrzeń nazw
Domyślną przestrzeń nazw deklaruje się atrybutem `xmlns` (bez prefiksu):
```xml
Jan
Kowalski
123-456-78-90
To jest bardzo fajny facet!
Business Consulting
987-654-32-10
```
### Różnica
Elementy **bez prefiksu** (np. `imie`, `nazwisko`) automatycznie należą do domyślnej przestrzeni nazw. Elementy z prefiksem (`inst:firma`) należą do przestrzeni wskazanej przez prefiks.
---
## Widoczność przestrzeni nazw
Deklaracja przestrzeni nazw może być **przesłonięta** w elementach potomnych:
```xml
Jan
Kowalski
123-456-78-90
Business Consulting
987-654-32-10
```
### Zasada widoczności
Prefiks `os` w elemencie `firma` został **przesłonięty** — teraz wskazuje na przestrzeń `instytucje`, a nie `osoby`. Deklaracje przestrzeni nazw mają zasięg **leksykalny** — obowiązują od punktu deklaracji do końca elementu.
---
## Nazwy z prefiksem i bez
### Nazwy elementów
| Typ nazwy | Opis |
|---|---|
| **Kwalifikowane** | Należą do przestrzeni nazw: poprzedzone prefiksem, lub bez prefiksu (jeśli w zasięgu domyślnej przestrzeni nazw) |
| **Niekwalifikowane** | Nie należą do żadnej przestrzeni nazw: bez prefiksu, poza zasięgiem domyślnej przestrzeni nazw |
### Nazwy atrybutów
| Typ nazwy | Opis |
|---|---|
| **Poprzedzone prefiksem** | Należą do przestrzeni nazw |
| **Bez prefiksu** | Nie należą do żadnej przestrzeni nazw |
> Ważna różnica: atrybuty **bez prefiksu nigdy nie należą** do domyślnej przestrzeni nazw.
---
## Nazwy elementów bez prefiksów
```xml
Jan
Kowalski
123-456-78-90
Business Consulting
987-654-32-10
```
### Wyłączenie z przestrzeni nazw
Atrybut `xmlns=""` **wyłącza** domyślną przestrzeń nazw — element `firma` i jego potomkowie nie należą do żadnej przestrzeni nazw.
---
## Nazwy atrybutów
```xml
Jan
Kowalski
123-456-78-90
Business Consulting
```
### Analiza
| Atrybut | Przynależność |
|---|---|
| `xlink:type` | Przestrzeń nazw `xlink` |
| `xlink:href` | Przestrzeń nazw `xlink` |
| `rodzaj` | **Bez przestrzeni nazw** (mimo domyślnej) |
> Atrybut `rodzaj` nie ma prefiksu, więc nie należy do żadnej przestrzeni nazw — mimo że element `pracuje-w` należy do domyślnej przestrzeni.
---
## Atrybuty: ta sama nazwa czy nie?
Reguła: **atrybuty o tej samej nazwie rozszerzonej (przestrzeń + nazwa) nie mogą się powtarzać** w tym samym elemencie.
### Poprawne
```xml
```
Dwie różne przestrzenie nazw → różne nazwy rozszerzone → OK.
### Niepoprawne
```xml
```
Ta sama przestrzeń nazw → ta sama nazwa rozszerzona → błąd.
### Poprawne (prefiks + bez prefiksu)
```xml
```
`n1:a` ma przestrzeń nazw, `a` nie ma — różne nazwy rozszerzone → OK.
---
# Część 3
## Przestrzenie nazw a schematy
---
## Przestrzenie nazw i schematy
Schemat (XSD) deklaruje nazwy należące do przestrzeni nazw:
- Schemat zapisuje się przy pomocy **jednego lub więcej** dokumentów schematów,
- Schemat deklaruje nazwy należące do **zero lub więcej** przestrzeni nazw,
- Dokument schematu deklaruje nazwy należące do **zero lub jednej** przestrzeni nazw,
- Przestrzeń nazw zawiera nazwy zadeklarowane w **zero lub więcej** schematach.
```mermaid
flowchart LR
subgraph "http://szz.mimuw.edu.pl/osoby"
O[osoba, imię, nazwisko, NIP]
end
subgraph "http://szz.mimuw.edu.pl/instytucje"
F[firma, nazwa, NIP]
end
O -->|osoby.xsd| S1
F -->|inst.xsd| S2
```
---
## Dokument schematu — targetNamespace
Atrybut `targetNamespace` określa, jaką przestrzeń nazw deklaruje schemat:
```xml
...
```
### Alternatywna forma (domyślna przestrzeń XSD)
```xml
...
```
---
## Łączenie dokumentów schematów
Schemat może składać się z wielu dokumentów. Metody budowania schematu:
| Metoda | Opis |
|---|---|
| **Instrukcje** | `include`, `import` i `redefine` |
| **Lokalizacje w egzemplarzu** | Określone w dokumencie instancji |
| **Predefiniowane lokalizacje** | Procesor łączy dokumenty z skonfigurowanych lokalizacji |
| **Parametry wiersza poleceń** | Lokalizacje przekazywane jako argumenty |
---
## include
Instrukcja `include` dołącza dokument schematu do **docelowej przestrzeni nazw** głównego schematu:
```xml
...
```
### Warunek
Dołączany dokument musi:
- mieć **taką samą docelową przestrzeń nazw** jak dokument główny, lub
- **nie mieć** docelowej przestrzeni nazw.
```mermaid
flowchart LR
subgraph "http://szz.mimuw.edu.pl/osoby"
A["osoby.xsd: osoba, imię, nazwisko, NIP"]
B["inst.xsd: firma, nazwa, REGON"]
end
```
---
## redefine
Instrukcja `redefine` dołącza dokument schematu z **możliwością przedefiniowania** komponentów:
```xml
```
### Co można przedefiniować
- typy proste i złożone,
- nazwane grupy modeli,
- grupy atrybutów.
```mermaid
flowchart LR
subgraph "http://szz.mimuw.edu.pl/osoby"
A["osoby.xsd: osoba, imię, nazwisko, NIP, NIPTyp"]
B["inst.xsd: firma, nazwa, REGON, NIPTyp"]
end
```
> `redefine` umożliwia rozszerzanie typów zdefiniowanych w dołączanym schemacie — zachowując tę samą przestrzeń nazw.
---
## import
Instrukcja `import` odwołuje się do komponentów w **innej przestrzeni nazw**:
```xml
...
```
```mermaid
flowchart LR
subgraph "osoby"
A["osoby.xsd"]
end
subgraph "instytucje"
B["inst.xsd"]
end
A -->|import| B
```
### Różnica include vs import
| Instrukcja | Przestrzeń nazw |
|---|---|
| **include** | Ta sama docelowa przestrzeń nazw |
| **import** | Inna przestrzeń nazw |
---
# Część 4
## Egzemplarze dokumentów
---
## Egzemplarz — przestrzeń nazw XML Schema Instance
Przestrzeń nazw egzemplarzy XML Schema:
`http://www.w3.org/2001/XMLSchema-instance`
zawiera atrybuty:
| Atrybut | Opis |
|---|---|
| `nil` | Oznaczenie wartości pustej |
| `type` | Określenie typu elementu |
| `schemaLocation` | Lokalizacja schematów (dla przestrzeni nazw) |
| `noNamespaceSchemaLocation` | Lokalizacja schematu (bez przestrzeni nazw) |
---
## schemaLocation
Atrybut `schemaLocation` wskazuje lokalizację schematów dla poszczególnych przestrzeni nazw:
```xml
JanKowalski
Business Consulting
987-654-32-10
```
### Format
Wartość `schemaLocation` to **pary** `przestrzeń-nazw lokalizacja`, rozdzielone spacjami.
---
## noNamespaceSchemaLocation
Atrybut `noNamespaceSchemaLocation` wskazuje schemat dla dokumentów **bez przestrzeni nazw**:
```xml
Jan
Kowalski
```
### Zastosowanie
Używane, gdy dokument nie korzysta z przestrzeni nazw — wtedy nie ma "nazwy przestrzeni" do sparowania ze schematem.
---
## Wartości puste w egzemplarzach
Istnieje kilka sposobów oznaczenia braku wartości:
| Sposób | Opis |
|---|---|
| **Brak elementu/atrybutu** | Element po prostu nie występuje |
| **Element/atrybut pusty** | Występuje, ale jest pusty |
| **Specjalna wartość** | Np. `N/A` |
| **Wartość nil** | Jawnie oznaczone `xsi:nil="true"` |
### Przykład wartości nil
```xml
Jan
Kowalski
```
### Dopuszczenie nil w schemacie
```xml
```
> Atrybut `nillable="true"` w schemacie jest **wymagany**, aby element mógł przyjąć wartość `xsi:nil="true"`.
---
## Podsumowanie
| Temat | Kluczowe wnioski |
|---|---|
| **Deklaracje globalne/lokalne** | Globalne wielokrotnego użytku, lokalne zagnieżdżone |
| **Elementy vs atrybuty** | Treść/struktura → elementy; metadane/identyfikatory → atrybuty |
| **default vs fixed** | Domyślna uzupełnia, ustalona narzuca |
| **Przestrzenie nazw** | Rozwiązanie kolizji nazw przez URI + prefiksy |
| **Domyślna przestrzeń** | `xmlns` bez prefiksu; atrybuty jej nie dziedziczą |
| **include/redefine/import** | Łączenie schematów: ta sama / redefinicja / inna przestrzeń |
| **targetNamespace** | Określa przestrzeń deklarowaną przez schemat |
| **schemaLocation** | Wiązanie przestrzeni nazw z lokalizacją schematu |
| **nil** | Jawne oznaczenie braku wartości (`nillable="true"`) |
---
# Dziękuję za uwagę
**Systemy Zarządzania Treścią**
Politechnika Poznańska