--- 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). ![width:90%](../img/namespace-problem.svg) ### 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