Test

From Training Material
Jump to navigation Jump to search

Tworzenie dokumentów w formacie XML

Struktura dokumentu XML Główne składniki dokumentu XML Elementy: puste, niepuste Atrybuty (umieszczone w elementach jako dodatkowe informacje), Deklaracje, Instrukcje przetwarzania, Jednostki (encje). Elementy <autor>Tadeusz Kowalski</autor> Elementy - przykłady <autor>Stanisław Wyspiański</Autor> niepoprawny

<autor>Tadeusz Nowakowski</autor> <autor>Jan Kowalski</autor> <AUTOR>Adam Nowak</AUTOR> Elementy - nazwy Nazwy elementów: mogą rozpoczynać się od: litery, _ (podkreślenia),

(dwukropka – jest to niezalecane)

mogą zawierać cyfry, litery, myślniki, podkreślenia, kropki, dwukropki Elementy puste Elementy mogą nie zawierać treści, zamiast dwóch znaczników - początkowego i końcowego – można wtedy użyć znacznika elementu pustego:

<bez_tekstu ></bez_tekstu > < bez_tekstu /> Podelementy, hierarchia Elementy mogą: być puste - <bez_tekstu/>, przechowywać tekst - <z_tekstem>tekst</z_tekstem>, zawierać podelementy:

<autorzy> <wspolautor>Jan Kowalski</wspolautor> <wspolautor>Adam Nowak</wspolautor> </autorzy>

W dokumencie XML musi istnieć dokładnie jeden element główny (korzeń) Elementy - zagnieżdżanie Elementy mogą być zagnieżdżone, ale nie mogą na siebie zachodzić – znacznik końcowy podelementu musi wystąpić przed znacznikiem końcowym elementu nadrzędnego, Każdy element (oprócz korzenia) musi być w całości otoczony przez inny element:

<imie>Jan<nazwisko>Kowalski</imie></nazwisko> - niepoprawne

<imie>Jan<nazwisko>Kowalski</nazwisko></imie> Ćwiczenie Które elementy są poprawne?

<Nazwa.1/> <Nazwa-1/> <Nazwa 1>cos<Nazwa 1> <1_Nazwa/> <.Nazwa/> <_Nazwa> <-Nazwa/> <Nazwa_1>cos<nazwa_1> <Nazwa><cos/></Nazwa> <Nazwa><cos></Nazwa></Cos> Atrybuty <autor miejsce=”drugi”> Jan Kowalski </autor> Atrybuty mogą występować jedynie w znaczniku początkowym lub w znaczniku elementu pustego, małe i duże litery w nazwach są rozróżniane, w jednym elemencie nie mogą istnieć dwa atrybuty o takiej samej nazwie, wartości atrybutów muszą być umieszczone w ” ” lub ’ ’

<autor miejsce=”pierwszy” Miejsce=”drugi” MIEJSCE=”trzeci”/>

<autor miejsce=”pierwszy” miejsce=”drugi” miejsce=”trzeci”/> niepoprawne Jako kodować dane? Problemy z atrybutami Atrybuty nie mogą zawierać wielu wartości nie mogą zawierać struktury drzewa XML nie są łatwe do rozbudowywania – przy wprowadzaniu zmian

Atrybuty są trudne w odczycie i obsłudze. Do przechowywania danych lepsze są elementy. Używaj atrybutów do informacji ułatwiających zarządzanie danymi.

   <messages>�  <note id="501">�    <to>Tove</to>�    <from>Jani</from>�    <heading>Reminder</heading>�    <body>Don't forget me this 	weekend!</body>�  </note>�  <note id="502">�    <to>Jani</to>�    <from>Tove</from>�    <heading>Re: Reminder</heading>�    <body>I will not</body>�  </note>�</messages> 

Deklaracja XML Na początku dokumentu XML należy umieścić deklarację XML, która określa: wersję języka XML użytego w dokumencie – parametr version (obowiązkowy), rodzaj kodowania znaków – parametr encoding, czy dokument jest samodzielny – parametr standalone. Deklaracja XML - przykłady <?xml version=”1.0” encoding=”UTF-8” standalone=”yes” ?>

<?xml version=”1.0” standalone=”yes” ?>

<?xml version=”1.0” encoding=”UTF-8” ?>

<?xml version=”1.0” ?> Komentarze Komentarze zaczynają się od wszystkie znaki między tymi dwoma napisami są ignorowane, nie mogą występować przed deklaracją XML, ani wewnątrz znaczników, wewnątrz komentarza nie może występować ciąg „--”, poza znacznikiem początku i końca komentarza. Encje predefiniowane Zastrzeżone znaki, których nie można wpisywać bezpośrednio jako wartości tekstowych: CDATA Cała sekcja CDATA jest traktowana jako tekst, konstrukcja sekcji: <![CDATA[tekst]]>

zastosowanie CDATA: umieszczanie fragmentu dokumentu XML w postaci zwykłego tekstu, umieszczanie kodów źródłowych (np. języka C lub Javy) Instrukcje przetwarzania Instrukcje przetwarzania (ang. processing instruction) zawierają informacje wykorzystywane przez programy przetwarzające dokumenty XML. umieszczone są w bloku ograniczonym znakami „<?” i „?>” umożliwiają umieszczanie w dokumentach XML fragmentów innych języków, np. języków programowania.

<?xml version=”1.0” encoding=”UTF-8”?> <!DOCTYPE nazwaDokumentu [ <!ELEMENT nazwaElementu ANY> … ]> … DTD wewnętrzne składa się z wielu deklaracji zgrupowanych w jeden blok (deklarację typu dokumentu), blok ten rozpoczyna się od słowa DOCTYPE

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE opis [ <!ELEMENT opis (#PCDATA)> ]> <opis> To jest opis </opis> DTD zewnętrzne inną metodą od deklarowania typów na początku dokumentu jest przechowywanie definicji w osobnym, zewnętrznym pliku, w dokumencie XML znajduje się wtedy tylko odwołanie do pliku DTD, w którym umieszczone są potrzebne informacje, zewnętrzne DTD może być prywatne (tylko do własnego użytku) lub publiczne (udostępniane innym użytkownikom), jako parametr dla SYSTEM podaje się odpowiedni adres (zwykle względny lub bezwzględny adres URL) Publiczne DTD zwykle opisuje jakiś uznany przez pewną społeczność standard dokumentów XML, wykorzystuje słowo kluczowe PUBLIC posiadający dodatkowy parametr FPI:

+|-//Właściciel//DTD Wersja//kodPaństwa//

znak „+” oznacza standardowe DTD, a „-” to DTD nie będące uznanym powszechnie standardem, kodPaństwa to dwuliterowy skrót oznaczający język DTD zewnętrzne - przykłady <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE opis SYSTEM ”opis.dtd”> <opis> To jest opis </opis> DTD zewnętrzne - przykłady DTD zewnętrzne DTD zewnętrzne umieszczone w osobnym pliku nie zawiera słowa kluczowego DOCTYPE, może być przetworzone lub nie – zależy to od wartości parametru standalone z deklaracji XML, istnieje możliwość łączenia DTD zawartego w pliku zewnętrznym z wewnętrznymi deklaracjami, oba zbiory – DTD wewnętrzne i DTD wewnętrzne muszą stanowić spójną całość – tzn. nie można np. zdefiniować dwukrotnie tego samego elementu w DTD zewnętrznym i wewnętrznym DTD deklaracja elementów Deklaracja elementu składa się z trzech części: słowa kluczowego ELEMENT, nazwy elementu (znacznika), słowa lub grupy słów definiujących jego zawartość:

<!ELEMENT nazwaElementu zawartoscElementu> DTD zawartość elementów w ramach zawartości elementu można stosować: (#PCDATA) – zawartość tekstowa (dowolna) EMPTY – element pusty (pozbawiony treści) ANY – element zawierający dowolne wartości

element może być zadeklarowany tylko jeden raz – deklaracja jest globalna DTD – deklaracja podelementów model grupy służy do opisu elementów zawierających elementy podrzędne, otoczony jest nawiasami „()” i zawiera przynajmniej jeden symbol opisujący podelement, jeżeli model zawiera więcej niż jeden symbol, podelementy mogą być zorganizowane na dwa sposoby: sekwencja wybór DTD – sekwencja podelementów zadane podelementy muszą wystąpić w podanej w deklaracji kolejności (sekwencji), w deklaracji sekwencji podelementy oddziela się za pomocą znaku przecinka

<!ELEMENT nazwaElementu (elem1, elem2, …, elemN)> DTD – wybór podelementów umożliwia dokonanie wyboru podelementów, które wystąpią w dokumencie XML, lista wyboru tworzone jest poprzez wstawienie znaku potoku „|” między nazwami elementów, możliwy jest wybór tylko jednego elementu listy jako podelementu lub pominięcie zawartości – podelement staje się elementem pustym

<!ELEMENT nazwaElementu (elem1 | … | elemN)>

DTD – sekwencja i wybór można łączyć oba rozwiązania – sekwencję i wybór, należy użyć dodatkowej pary nawiasów, które umożliwiają poprawne przetworzenie deklaracji elementu

<!ELEMENT nazwaElementu (elem1, (elem2 | elem3), elemN)>

DTD - przykłady Zawartość pliku dtd-przyklad.dtd:

<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT zdjecie EMPTY> <!ELEMENT panstwo (#PCDATA)> <!ELEMENT nazwisko (#PCDATA)> <!ELEMENT wynik (#PCDATA)> <!ELEMENT srebro (#PCDATA)> <!ELEMENT braz (#PCDATA)> <!ELEMENT dyscyplina (plec)> <!ELEMENT plec (konkurencja)> <!ELEMENT konkurencja (zloto, srebro, braz)> <!ELEMENT zloto ((panstwo, (nazwisko | druzyna), wynik, zdjecie))> DTD – przykłady c. d. DTD – ćwiczenia 1 stwórz plik plytoteka.xml opisujący płytotekę, zawierający informacje o twórcy i tytule płyty CD, wydawcy oraz tytułach utworów (po jednym elemencie), napisz DTD opisujące zaprojektowany dokument: w pliku plytotekaDTD.xml, w zewnętrznym pliku plytoteka.dtd Uwaga – nie korzystaj z atrybutów. DTD - liczba wystąpień elementów do określania liczby wystąpień elementów służą trzy symbole: DTD – ćwiczenia 2 popraw w DTD plików płytoteki liczby wystąpień elementów tak, aby można było dopisać: kilka płyt, kilka utworów na jednej płycie, kilku twórców jednej płyty dopisz odpowiednie wartości w dokumencie XML, przyjrzyj się plikowi sasiedzi.xml, a następnie zadeklaruj elementy w pliku sasiedzi.dtd Modele zawartości elementu Trzy modele zawartości elementu: zawartość tekstowa – element składa się wyłącznie z treści tekstowej, zawartość elementowa – element składa się wyłącznie z jednego lub więcej podelementów, zawartość mieszana – element składa się z treści tekstowej przeplatanej podelementami. Model mieszany w modelu mieszanym istnieją ograniczenia,

  1. PCDATA nie może występować w postaci selektywnej, a jedynie w wyborach (tylko z jednym wystąpieniem)

błędne deklaracje: <!ELEMENT nazwa (#PCDATA, elem2)> <!ELEMENT nazwa (#PCDATA | el1 | #PCDATA)> aby zadeklarować element posiadający tekst i podelementy należy użyć *: <!ELEMENT nazwa (#PCDATA | elem2)*> DTD – deklaracja atrybutów wszystkie atrybuty związane z danym elementem umieszcza się zwykle razem w jednej deklaracji listy atrybutów, deklarację tworzy słowo ATTLIST, po nim następuje nazwa elementu zawierającego atrybuty, reszta deklaracji to definicja atrybutu, w skład której wchodzą: nazwa atrybutu, typ atrybutu, wartość domyślna lub określenie konieczności występowania. DTD – deklaracja atrybutów - c. d. DTD – typ atrybutu DTD – wystąpienie atrybutu Można zastosować jedną z czterech możliwości:

  1. REQUIRED

atrybut jest obowiązkowy, bez określonej wartości

  1. IMPLIED

atrybut jest opcjonalny

  1. FIXED ”wartość”

wartość stała, zawsze taka sama ”wartość” wartością domyślną atrybutu jest ”wartość”

jeśli nie podamy żadnego słowa kluczowego – domyślnie #IMPLIED DTD – przykłady definicji atrybutów DTD – przykłady definicji atrybutów DTD – Ćwiczenia 3 Zadanie 1 zapisz kopię pliku Sydney2000.xml jako Sydney2000_1.xml napisz DTD opisujące plik Sydney2000_1.xml (elementy i atrybuty): umieść je wewnątrz pliku i zapisz jako Sydney2000DTD.xml, umieść je w oddzielnym pliku DTD - olimpiada.dtd i dodaj odwołanie

DTD – zastosowanie ID, IDREF DTD – zastosowanie ID, IDREF c. d. utworzenie identyfikatora: <!ATTLIST zawodnik ident ID #REQUIRED> deklaracja odnośników: <!ATTLIST zloto ident IDREF #REQUIRED> <!ATTLIST srebro ident IDREF #REQUIRED> <!ATTLIST braz ident IDREF #REQUIRED> można również zadeklarować listę odnośników: <!ATTLIST polacy identyfikatory IDREFS #REQUIRED> DTD – Ćwiczenia 4 zbuduj za pomocą DTD plik opisGeograficzny.dtd opisujący kontynenty (nazwa, powierzchnia) i państwa (nazwa, powierzchnia , ludność, waluta), ustaw jako odnośnik do kontynentu atrybut elementu „panstwo” np. „kont”, uzupełnij danymi plik opisGeograficzny.xml i dodaj odniesienie do DTD. Przestrzenie nazw pojedynczy dokument XML może zawierać elementy i atrybuty zdefiniowane nie tylko w XML ale np. w HTML, a w szczególności w różnych DTD, w różnych DTD mogą znaleźć się elementy o tej samej nazwie np. tytuł (książki) oraz tytuł (stopień naukowy), każdy z języków znacznikowych można potraktować jako zbiór nazw – przestrzeń nazw i przypisać im prefix (dzięki któremu rozróżnia się elementy o takich samych nazwach).

Prefix_przestrzeni:nazwa_z_przestrzeni Przestrzenie nazw Deklaracja prefiksu wewnątrz dokumentu:

<?xml version="1.0" ?> <JEZYK_HTML:p xmlns:JEZYK_HTML="http://www.w3.org/TR/REC-html40">

 Treść traktowana jako paragraf w języku HTML

</JEZYK_HTML:p> Przestrzenie nazw Wiele przestrzeni nazw, przestrzeń domyślna DTD a przestrzenie nazw Deklaracje DTD nie w pełni korzystają z możliwości, jakie dają przestrzenie nazw. Wynika to z faktu, ze deklaracje DTD zostały zatwierdzone przez W3C wcześniej, niż przestrzenie nazw.

Nie ma możliwości umieszczenia w DTD: informacji o URI (nie można deklarować nazw dla wielu różnych przestrzeni), prefiksu dla danego języka. DTD – encje i notacje Encje (ang. entities) zwane też jednostkami umożliwiają nazywanie fragmentów języka XML, dzięki czemu, przez odwołanie do tych nazw, możliwe jest wielokrotne wykorzystanie raz zadeklarowanych fragmentów. DTD – rodzaje encji (schemat) DTD – rodzaje encji odwołania do encji parametrycznych można umieszczać jedynie w DTD, a do ogólnych w całym dokumencie, encje wewnętrzne mogą być wykorzystywane jedynie w ramach tego samego dokumentu XML, zewnętrzne mogą być współdzielone, deklaracje jednostek wewnętrznych zawierają nazwę i wartość (ciąg znaków) – w miejscach odwołań do takich jednostek parser zmienia nazwę na zadeklarowany ciąg znaków, jednostki wewnętrzne zawsze są parsowane (przetwarzane przez parser poprzez zamianę nazwy na ich treść), jednostki zewnętrzne ogólne w zależności od deklaracji są albo nie są parsowane. Encje parametryczne wewnętrzne Encje parametryczne wewnętrzne: są deklarowane w DTD i mogą być wykorzystywane wyłącznie w tym samym DTD (po ich deklaracji), służą do nadania nazwy pewnemu ciągowi znaków powtarzającemu się w danej deklaracji DTD, definiuje się przez dodanie znaku „%” za słowem ENTITY, po którym następuje nazwa i opis (tekst w cudzysłowie) tego co pod nazwą się kryje: <!ENTITY % nazwa ”tekst”> odwołań do encji dokonuje się przez podanie jej nazwy poprzedzonej znakiem „%” i zakończonej średnikiem. Przykład encji parametrycznych wewnętrznych Encje parametryczne zewnętrzne Encje parametryczne zewnętrzne: służą do odwołań do zewnętrznych plików, w których znajdują się fragmenty DTD – dzięki temu możliwy jest podział złożonych DTD na fragmenty, w miejscu użycia jednostki wstawiana jest zawartość zewnętrznego pliku wskazanego w deklaracji encji, w deklaracji można wykorzystać słowo SYSTEM lub PUBLIC.

<!ENTITY % nazwa SYSTEM ”plik.dtd”> Przykład encji parametrycznej zewnętrznej Encje ogólne Encje ogólne: służą do deklarowania fragmentów języka XML, które można następnie wykorzystać w tekście dokumentów lub w niektórych przypadkach w DTD (w miejscach, w których ostatecznie wystąpią w treści XML – np. jako domyślna wartość atrybutu), deklaracje encji ogólnych nie zawierają znaku „%”, nazwę encji w wywołaniu poprzedza znak „&”, wewnętrzne jednostki ogólne i parametryczne są bardzo podobne (ogólne można wykorzystywać dodatkowo w treści dokumentu) Przykład encji ogólnej wewnętrznej Encje ogólne zewnętrzne przetwarzane Encje ogólne zewnętrzne: służą do umieszczania w deklaracjach DTD, lub w treści dokumentu fragmentów języka XML pochodzących z zewnętrznego pliku, mogą być prywatne (SYSTEM) lub publiczne (PUBLIC), zewnętrzne jednostki są przetwarzane tylko wtedy, gdy w deklaracji XML umieszczono standalone=”no”, lub gdy pominięto ten parametr. Przykład encji ogólnej zewnętrznej przetwarzanej Encje ogólne zewnętrzne nieprzetwarzane włączenie treści nieparsowanej jest na razie obsługiwane jedynie przez walidatory, przeglądarki nie pokazują zawartości takiej encji, treścią encji może być w zasadzie wszystko – dane binarne i tekst.

Przykład encji ogólnej zewnętrznej nieprzetwarzanej Ćwiczenia Zadanie 2 Zadanie 3 DTD – uwagi kolejność deklaracji elementów, atrybutów i encji nie ma znaczenia, wszystkie deklaracje elementów są globalne – nie można ich użyć w zależności od kontekstu – element o danej nazwie nie może być zadeklarowany dwukrotnie opisie, DTD jest biedniejszym bratem XML Schema DTD – podsumowanie DTD jest nieodłączną składową dobrego systemu opartego na XML, w wielu przypadkach DTD umieszcza się w osobnych plikach dla lepszej przejrzystości, DTD może stanowić rodzaj dokumentacji, w przypadku braku DTD: atrybuty nie mogą mieć wartości domyślnych, atrybuty nie mogą być odsyłaczami do jednostek, atrybuty są zawsze opcjonalne, można wykorzystywać jedynie 5 podstawowych encji wbudowanych. DTD – kilka braków brak możliwości ograniczenia tekstowej treści elementu, brak wartości domyślnych dla elementów, brak możliwości ustalenia kolejności atrybutów, brak możliwości zmiany kolejności elementów, brak możliwości wykorzystania w pełni przestrzeni nazw,

XML Schema

XML Schema zatwierdzony 2 maja 2001 standard W3C umożliwiający dokładne opisanie drzewiastej struktury dokumentu XML – typów danych znajdujących się w elementach i atrybutach, zastępuje w pewnym sensie DTD, z każdego DTD można automatycznie wygenerować odpowiadający mu schemat, jednak nie odwrotnie, w schematach umieszczane są deklaracje elementów i atrybutów, dodatkowo można określać wzorce i typy zawartości elementów i atrybutów, schemat jest zewnętrzny w stosunku do dokumentu XML (plik .xsd), nie zawiera żadnych odnośników do dokumentu, powiązanie następuje z poziomu dokumentu XML. Struktura schematu Powiązanie schematu z dokumentem XML Składowe schematu Podstawowymi strukturami schematów są elementy o nazwach element oraz atrybut, które umożliwiają odpowiednio deklarowanie elementów lub atrybutów:

<xsd:element name="imie" type="xsd:string">

<xsd:attribute name="wiek" type="xsd:integer"> Typy proste a typy złożone W deklaracjach elementów i atrybutów podaje się typ zawartości elementu lub atrybutu: służy do tego atrybut type atrybut type może przybierać wartości: build-in-type (typ wbudowany) – zdefiniowany bezpośrednio przez standard XML Schema simple type (typ prosty) – własnego, zdefiniowanego w innej części dokumentu (do definiowania element <xsd:simpleType>), można definiować jedynie bezpośrednią zawartość elementu lub atrybutu (bez podelementów) complex type (typ złożony) – własnego, zdefiniowanego w innej części dokumentu (do definiowania element <xsd:complexType>), można definiować istnienie podelementów w elemencie Typ prosty - przykład Definicja typu o nazwie wiek jako liczby od 1 do 150

<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:simpleType name="wiek"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1"/> <xsd:maxInclusive value="150"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="wiekosoby" type="wiek"/> <xsd:attribute name="wiek" type="wiek"/> </xsd:schema> Typ złożony - przykład Konieczny do definicji elementów z atrybutami lub podelementami

<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="adres" type="mojadres"/> <xsd:complexType name="mojadres"> <xsd:sequence> <xsd:element name="ulica" type="xsd:string"/> <xsd:element name="nrdomu" type="mojnrdomu"/> <xsd:element name="miasto" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="typadresu" type="xsd:token" fixed="czasowy"/> </xsd:complexType> <xsd:simpleType name="mojnrdomu"> <xsd:restriction base="xsd:positiveInteger"/> </xsd:simpleType> </xsd:schema> Typ złożony

definicje atrybutów umieszcza się zawsze po definicjach podelementów
należy stosować gdy:

istnieją tylko podelementy bez atrybutów, istnieją podelementy i atrybuty, istnieje treść oraz atrybuty, istnieją tyko atrybuty, wprowadzamy nowy typ złożony poprzez dodanie do typu złożonego innych podelementów lub atrybutów. Wbudowane typy danych Ze względu na strukturę dzielimy na: typy atomowe (atomic datatypes) – takie których wartości są niepodzielne listy (list datatype) – skończona lista wystąpień jednego typu atomowego kombinacje (union datatypes) – złożenia dowolnych (także różnych) typów atomowych lub list jednocześnie Ze względu na pochodzenie dzielimy na: podstawowe (primitive) – nie wynikające z innych typów pochodne (derived) – wyprowadzane z innych typów Ze względu na kategorie (dziedziny) dzielimy na: czasowe, logiczne, binarne, znakowe, liczbowe, typy XML Typy czasowe

duration – czas trwania bez określonego początku i końca 	

(P1Y2M3DT10H30M12.3S)

dataTime – określony punkt w czasie (YYYY-MM-DDThh:mm:ss-hh:mm)�	(-hh:mm przesunięcie względem GMT u nas +1 zimowy +2 letni)
time – określony punkt czasowy w ciągu dnia (hh:mm:ss-hh:mm), okrojony 	dataTime
date – określa datę wg kalendarza gregoriańskiego (YYYY-MM-DD), okrojony 	dataTime
gYearMonth – oznacza miesiąc w roku (YYYY-MM) okrojony date
gYear – oznacza rok (YYYY), okrojony gYearMonth
gDay – oznacza dzień dowolnego miesiąca (---DD)
gMonthDay – oznacza dzień konkretnego miesiąca (--MM-DD)
gMonth – oznacza numer dowolnego miesiąca (--MM--)

Typy binarne, znakowe i logiczny

hexBinary – dane binarne zakodowane w formie tekstowej (N – 4E) 	każdemu bajtowi odpowiadają dwa
base64Binary – dane binarne zakodowane w formie tekstowej za 	pomocą Base64 Content-Transfer-Encoding (RFC 2045 	section 6.8) każdym 3 bajtom odpowiadają 4 (ABC – GUJD)
string – dowolny ciąg znaków ze standardu Unicode
normalizedString ciąg znaków bez tabulacji, znaków nowego 	wiersza i powrotu karetki
token – ciąg znaków bez znaków: tabulacji, nowego wiersza, 	powrotu karetki, wiodących i kończących spacji, ciągów 	spacji 	(dopuszczalne pojedyncze); zwykle pojedyncze słowo
boolean – typ logiczny o dwu wartościach prawda i fałsz  (true, false, 	1, 0)

Typy liczbowe

float – 32-bitowa liczba zmiennoprzecinkowa (-1E4, 10000, 35.34E-2, 	0, -0, INF – nieskończoność, -INF, NaN)
double – 64-bitowa liczba zmiennoprzecinkowa
integer – liczba całkowita dowolna (bez nieskończoności)
nonPositiveInteger – całkowita liczba niedodatnia
negativeInteger – całkowita liczba ujemna
nonNegativeInteger, positiveInteger – analogicznie
long – ośmiobajtowa liczba całkowita
int – czterobajtowa liczba całkowita
short – dwubajtowa liczba całkowita
byte – jednobajtowa liczba całkowita
unsignedLong, unsignedInt, unsignedShort, unsignedByte

Typy XML

anyURI – dowolny identyfikator URI (w tym URL) (http://przykllad.pl)
Qname – nazwa przestrzeni nazw (xsd:element)
NOTATION – oznacza typ dla atrybutu NOTATION z XML 1.0 
language – dowolna prawidłowa wartość xml:lang (EN, en-US, PL) 
Name – część lub całość prawidłowej nazwy URI (musi zaczynać się od 	litery, podkreślenia, dwukropka)
NCName – lokalna nazwa (bez przestrzeni i dwukropka)
ID – identyfikator, niepowtarzalny w ramach całego dokumentu XML
IDREF – oznacza typ dla atrybutu IDREF z XML 1.0
ENTITY – oznacza typ dla atrybutu ENTITY z XML 1.0 
NMTOKEN – oznacza typ dla atrybutu NMTOKEN z XML 1.0
IDREFS, ENTITIES, NMTOKENS – odpowiednie listy rozdzielone spacjami

Aspekty (facets)

służą do scharakteryzowania dopuszczalnych wartości elementów i atrybutów
aspekty wymuszające (constraining facets):
length, minLength, maxLength – dokładna, minimalna i maksymalna 	długość (string). Dla typów pochodnych hexBinary, base64Binary – 	liczby obiektów; dla list – liczby elementów.
maxInclusive, maxExclusive, minInclusive, minExclusive – aspekt 	ograniczający zakres wartości liczbowych. Górna i dolna granica 	liczb (wraz z granicą lub bez niej)
totalDigits – aspekt wymuszający maksymalną liczbę cyfr (bez przecinka)
fractionDigits – ilość miejsc po przecinku
pattern – umożliwia określenie dokładnego wzorca wartości elementu lub atrybutu.
enumeration – określenie wartości dozwolonej w danym typie
whiteSpace – określa jak mają być traktowane białe znaki (preserve, 	replace, collapse) 

Aspekty określające długość - przykłady łańcuchy znaków, listy, ciągi binarne length, minLength, maxLength Aspekty określające długość - przykłady Aspekty ograniczające wartości liczbowe - przykład 1a <xsd:simpleType name="do1000wl1"> <xsd:restriction base="xsd:integer"> <xsd:maxInclusive value="1000"/> </xsd:restriction> </xsd:simpleType>

<xsd:simpleType name="do1000wl2"> <xsd:restriction base="xsd:integer"> <xsd:maxExclusive value="1001"/> </xsd:restriction> </xsd:simpleType> Aspekty ograniczające wartości liczbowe - przykład 1b Aspekty ograniczające wartości liczbowe - przykład 2

Typ walutowy i procentowy

totalDigits, fractionDigits

Waluta - zawsze 2 miejsca o przecinku maksymalnie 999.99

<xsd:simpleType name="waluta"> <xsd:restriction base="xsd:decimal"> <xsd:totalDigits value="5"/> <xsd:fractionDigits value="2" fixed="true"/> </xsd:restriction> </xsd:simpleType>

Procent - może mieć jedno miejsce po przecinku (maksymalnie 99.9)

<xsd:simpleType name="procent"> <xsd:restriction base="xsd:decimal"> <xsd:totalDigits value="3"/> <xsd:fractionDigits value="1"/> </xsd:restriction> </xsd:simpleType> Wzorce wartości

postać wzorcową dla dopuszczalnych wartości określa się poprzez 	aspekt pattern
wartość atrybutu value określa wzorzec

Zasady: w nawiasach kwadratowych podaje się zakresy ( [1-9], [A-Z], [a-z]), wyliczenia ( [12], [YNAC], [BCDEFGKLNOPRSTWZ], [a-zA-Z0-9]) nawiasy klamrowe oznaczają ilość wystąpień ([0-1] {8}) nawiasy okrągłe umożliwiają zastosowanie innych elementów do całej grupy np. (012){3} oznacza ciąg 012012012;

  • , ?, + podobnie jak DTD np. [01]+ dowolnie długi (co najmniej jeden znak) ciąg zer i jedynek

. oznacza dowolny znak ^ oznacza negację ( [^ABC] nie może wystąpić A, B i C) Zasady budowania wzorców cd. | oznacza alternatywę \w pojedyncze słowo \n, \t, \r - nowy wiersz, tabulację, powrót karetki \s dowolny biały znak \d dowolna cyfra ([0-9]) \D nie cyfra \i dowolny znak, który może rozpoczynać nazwę (litera, '_', ':') \l dowolny znak, który nie może rozpoczynać nazwy \c dowolny znak, który może zawierać się w nazwie (cyfry, '.', '-') \C dowolny znak który nie może zawierać się w nazwie \znak określa znaki specjalne {} [] () * ? + ^ | Budowa wzorców – przykłady NIP dwie postacie - 123-45-67-890 lub 123-456-78-90:

�<xsd:simpleType name="mojNIP">

<xsd:restriction base="xsd:string"> <xsd:pattern value="([0-9]{3}-[0-9]{2}-[0-9]{2}-[0-9]{3})| ([0-9]{3}-[0-9]{3}-[0-9]{2}-[0-9]{2})"/> </xsd:restriction> </xsd:simpleType> Budowa wzorców – przykłady Ćwiczenia Zadanie 1 Wyliczenia

Aspekt enumeration daje ten sam efekt co typ wyliczeniowy znany z DTD
przydatny do list skończonych

<xsd:simpleType name="mojaOdpowiedz"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="tak"/> <xsd:enumeration value="nie"/> <xsd:enumeration value="może"/> <xsd:enumeration value="nie wiem"/> </xsd:restriction> </xsd:simpleType> Blokowanie wartości aspektów <xsd:simpleType name="mojciag"> <xsd:restriction base="xsd:string"> <xsd:minLength value="2" fixed="true"/> <xsd:maxLength value="30"/> </xsd:restriction> </xsd:simpleType>

<xsd:simpleType name="mojciag1"> <xsd:restriction base="mojciag"> <xsd:minLength value="2" fixed='true"/> <xsd:maxLength value="123"/> </xsd:restriction </xsd:simpleType> Wymuszenia występowania

Z założenia minOccurs=1 oraz maxOccurs=1
Jeśli nieokreślona liczba wystąpień należy podać wartość unbounded
Przykłady:

<xsd:element name="imie" type="xsd:string" minOccurs="1" maxOccurs="2"/> <xsd:element name="opis" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> (*) <xsd:element name="opis" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> (+) <xsd:element name="opis" type="xsd:string" minOccurs="0" maxOccurs="1"/> (?) DTD a XML Schema – liczba wystąpień <?xml version="1.0" encoding="UTF-8"?>�<!ELEMENT osoba (nazwisko, imie+, panienskie?, dzieci*)>��<!ELEMENT nazwisko ANY>�<!ELEMENT imie ANY>�<!ELEMENT panienskie ANY>�<!ELEMENT dzieci ANY> <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="osoba"> <xsd:complexType> <xsd:sequence> <xsd:element name="nazwisko"/> <xsd:element name="imie" maxOccurs="unbounded"/> <xsd:element name="panienskie" minOccurs="0"/> <xsd:element name="dzieci" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> Występowanie atrybutu

może wystąpić raz albo w ogóle (podobnie jak w DTD)
nie może wystąpić więcej niż raz (wymóg XML)
sposób występowania poprzez atrybut use

required optional prohibited

<xsd:attribute name="wiek" type="xsd:string" use="required"/>

<xsd:attribute name="klasa" type="xsd:string" use="optional" default="IV"/> Domyślne i stałe wartości elementów i atrybutów <xsd:element name="wersja" fixed="1.0"/> <wersja>1.0</wersja> <wersja/> <xsd:element name="osoba" default="uczeń"/> <osoba>uczeń</osoba> <osoba/> <osoba>nauczyciel</osoba>

<xsd:attribute name="wersja" fixed="1.0"/> <xsd:attribute name="osoba" default="uczeń"/> Typy złożone zawierające elementy Definicja elementu zawierającego podelementy poprzez znacznik complexType oraz jeden z trzech dozwolonych w nim podelementów tzw. składaczy (compositors): sequence (sekwencja) – określa ścisłą kolejność wystąpień elementów (muszą wystąpić w podanej kolejności) choice (wybór) – wykazuje wystąpienie tyko jednego z podanych elementów all – określa nieuporządkowany zbiór podelementów (muszą wystąpić wszystkie podelementy w dowolnej kolejności) sequence - przykład <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="rozprawka"> <xsd:complexType> <xsd:sequence> <xsd:element name="wstep" type="xsd:string"/> <xsd:element name="rozwiniecie" type="xsd:string"/> <xsd:element name="zakonczenie" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

<?xml version="1.0"?> <rozprawka xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Rozprawka.xsd"> <wstep>To jest wstęp do rozprawki.</wstep> <rozwiniecie>Po wstępie następuje rozwinięcie.</rozwiniecie> <zakonczenie>Zakończenie wieńczy dzieło.</zakonczenie> </rozprawka> choice - przykład <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="wynikMeczu"> <xsd:complexType> <xsd:choice> <xsd:element name="wygrana" type="xsd:string"/> <xsd:element name="remis" type="xsd:string"/> <xsd:element name="przegrana" type="xsd:string"/> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema>

<?xml version="1.0"?> <wynikMeczu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="WynikMeczu1-3.xsd"> <wygrana>3:1</wygrana> </wynikMeczu>

<?xml version="1.0"?> <wynikMeczu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="WynikMeczu1-3.xsd"> <remis>2:2</remis> </wynikMeczu> all - przykład <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="daneOsoby"> <xsd:all> <xsd:element name="imie" type="xsd:string"/> <xsd:element name="nazwisko" type="xsd:string"/> <xsd:element name="nrDO" type="xsd:string" minOccurs="0"/> <xsd:element name="nrPesel" type="xsd:string"/> </xsd:all> </xsd:complexType> <xsd:element name="osoba" type="daneOsoby" maxOccurs="unbounded"/> </xsd:schema>

<?xml version="1.0"?> <osoba xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="DaneOsoby1-2.xsd"> <nrDO>KDD 1212134</nrDO> <nrPesel>79112000345</nrPesel> <nazwisko>Kowalski</nazwisko> <imie>Jan</imie> <imie>Jan</imie> <nazwisko>Kowalski</nazwisko> <nrPesel>70121100023</nrPesel> </osoba> Składacze choice i sequence Mmożliwość występowania minOccurs i maxOccurs <xsd:element name="HistoriaSpotkanDwochDruzyn"> <xsd:complexType> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="wygrana" type="xsd:string"/> <xsd:element name="remis" type="xsd:string"/> <xsd:element name="przegrana" type="xsd:string"/> </xsd:choice> </xsd:complexType> </xsd:element> Możliwość łączenia choice i sequence: <xsd:element name="kontrahent"> <xsd:complexType> <xsd:choice> <xsd:element name="firma" type="xsd:string"/> <xsd:sequence> <xsd:element name="imie" type="xsd:string"/> <xsd:element name="nazwisko" type="xsd:string"/> </xsd:sequence> </xsd:choice> </xsd:complexType> </xsd:element> Można również umieszczać choice w sequence Składacz all w skład all mogą wchodzić pojedyncze elementy (nie może być ani sequence, ani choice, ani grupy)

żaden podelement nie może się powtarzać

podelementy zawarte w all mają zawsze maxOccurs=”1” a minOccurs=”0” lub ”1”

element all nie może być zagnieżdżony w żadnym innym składaczu

jeżeli w complexType zastosowano all i jest to rozszerzenie innego typu wtedy typ bazowy musi być pusty all - przykład <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="grupaStudentow"> <xsd:complexType> <xsd:sequence> <xsd:element name="student" maxOccurs="20"> <xsd:complexType> <xsd:all> <xsd:element name="imie" type="xsd:string"/> <xsd:element name="nazwisko" type="xsd:string"/> <xsd:element name="nrDowodu" type="xsd:string" minOccurs="0"/> </xsd:all> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> XML Schema a DTD

zalety:

składnia dokumentu XML duża różnorodność typów tworzenie własnych typów włącznie z dziedziczeniem zawiera przestrzenie nazw importowanie typów z innych schematów możliwość stosowania aspektów możliwość tworzenia grup elementów i atrybutów stosowanie składaczy możliwość tworzenia list

wady:

bardziej skomplikowana struktura dłuższy opis brak jednostek (encji) mało rozpowszechniony Ćwiczenia Zadanie 2 Zadanie 3a, 3b Zadanie 4 XML Schema – elementy zaawansowane Typy złożone Typy złożone - complex type: Typ użytkownika zdefiniowanego w innej części dokumentu (do definiowania element <xsd:complexType>) można definiować istnienie podelementów w elemencie Deklaracja typu może zawierać Deklaracje elementów Deklaracje atrybutów Kategorie typów złożonych simple content – dla elementów o zawartości tekstowej (bez podelementów) z atrybutami complex content – dla elementów z podelementami i atrybutami Typ złożony - simple content Simple content można deklarować za pomocą: Ograniczenia (restriction) Można ograniczać zawartość tekstową Można dodać atrybuty Rozszerzenia (extension) Można tylko dodać atrybuty <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="kontrahent" type="typKontrahent"/> <xsd:complexType name="typKontrahent"> <xsd:simpleContent> <xsd:extension base="nazwaFirmy"> <xsd:attribute name="statusFirmy" type="xsd:token" use="required"/> <xsd:attribute name="formaDzialaln" type="xsd:token" use="optional"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="nazwaFirmy"> <xsd:restriction base="xsd:string"> <xsd:maxLength value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>

Typ złożony – complex content Elementy mogą posiadać podelementy i atrybuty Zawartość elementu może mieć postać Sekwencji (sequence) – wymagana kolejność wystąpienia podelementów Wyboru (choice) – wybór jednego podelementu Zbioru (all) – dowolna kolejność wystąpień podelementów Grupy (group) – umożliwia grupowanie podelementów Typy złożone – przykład <xsd:element name="adres" type="mojadres"/> <xsd:complexType name="mojadres"> <xsd:sequence> <xsd:element name="ulica" type="xsd:string"/> <xsd:element name="nrdomu" type="mojnrdomu"/> <xsd:element name="miasto" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="typadresu" type="xsd:token" /> </xsd:complexType> <xsd:simpleType name="mojnrdomu"> <xsd:restriction base="xsd:positiveInteger"/> </xsd:simpleType>

Dziedziczenie typów złożonych Nowe typy złożone można tworzyć przez: Rozszerzanie (extension) istniejących typów Ograniczenia (restriction) istniejących typów Dziedziczenie typów - extension Typ bazowy:

<xs:complexType name="Address"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="street" type="xs:string"/> <xs:element name="city" type="xs:string"/> </xs:sequence> </xs:complexType> Dziedziczenie typów - extension Typ pochodny:

<xs:complexType name="US-Address"> <xs:complexContent> <xs:extension base="Address"> <xs:sequence> <xs:element name="state" type="xs:string"/> <xs:element name="zip" type="xs:positiveInteger"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="myUSAddress" type="US-Address"/> Dziedziczenie typów - restriction <xs:complexType name="Items"> <xs:sequence> <xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="subItems"> <xs:complexContent> <xs:restriction base="Items"> <xs:sequence> <xs:element name="item" type="xs:string" minOccurs="1" maxOccurs="2"/> </xs:sequence> </xs:restriction> </xs:complexContent> </xs:complexType> Typy anonimowe Deklaracja typy anonimowego: Nie zawiera atrybutu name Nie zawiera atrybutu type

<xs:element name="quantity"> <xs:simpleType> <xs:restriction base="xs:positiveInteger"> <xs:minInclusive value="1"/> </xs:restriction> </xs:simpleType> </xs:element>

Grupy Grupowanie elementów lub atrybutów umożliwia wielokrotne wykorzystywanie raz zdefiniowanych grup (np. w różnych deklaracjach typów) Grupy elementów - przykład <xs:group name="współrzędne"> <xs:sequence> <xs:element name="x" type="xs:double"/> <xs:element name="y" type="xs:double"/> </xs:sequence> </xs:group>

<xs:attributeGroup name="atrybuty-krawędzi"> <xs:attribute name="kolor-krawędzi" type="KolorTyp"/> <xs:attribute name="grubość-krawędzi" type="xs:positiveInteger"/> </xs:attributeGroup>

<xs:element name="punkt"> <xs:complexType> <xs:sequence> <xs:group ref="współrzędne" minOccurs="1" maxOccurs="1"/> </xs:sequence> <xs:attributeGroup ref="atrybuty-krawędzi"/> </xs:complexType> </xs:element>

Ćwiczenie 1 XML Schema Best Practicies Użyj typów zamiast elementów, jeśli zawartość elementu ma być wykorzystywana przez inne elementy Korzystaj z atrybutów, aby zwiększyć czytelność dokumentu XML i zmniejszyć jego rozmiar Używaj opisowych, ale nie za długich nazw typów, korzystaj z notacji camelCase Nie używaj typów anonimowych Element <schema> <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com" xmlns="http://www.example.com"



elementFormDefault="qualified" attributeFormDefault="unqualified"> </xs:schema>

Zgodność ze schematem <?xml version="1.0" encoding="UTF-8"?> <root xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.com Schema1.xsd"/>

Atrybut xsi:schemaLocation określa lokalizację schematów definiujących elementy i atrybuty z różnych przestrzeni nazw Wartością atrybutu jest lista par: identyfikator przestrzeni nazw, URL dokumentu ze schematem

xsi:noNamespaceSchemaLocation – podaje lokalizację (URL) schematu definiującego elementy i atrybuty nie należące do przestrzeni nazw. Importowanie schematów Za pomocą elementu xs:import można importować schematy zapisane w innych plikach: <xs:schema …> <xs:import namespace="www.a.com" schemaLocation="A.xsd"/> <xs:import namespace="www.b.com" schemaLocation="B.xsd"/> </xs:schema> Umożliwia dostęp do elementów i typów zadeklarowanych w innych przestrzeniach nazw Element nadrzędny – xs:schema

Włączanie schematów Za pomocą xs:include można włączać inne schematy <xs:schema …> <xs:include schemaLocation="Schema2.xsd"/> </xs:schema> Wszystkie włączane schematy muszą mieć taką samą wartość atrybutu targetNamespace Element nadrzędny – xs:schema xs:import i xs:include muszą wystąpić przed deklaracjami typów i elementów w schemacie Zmiana definicji Element xs:redefine umożliwia przedefiniowanie typów prostych i złożonych, grup i grup atrybutów z zewnętrznych schematów Przedefiniowane elementy należą do przestrzeni nazw określonej w atrybucie targetNamespace danego schematu xs:redefine przykład <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:complexType name="BookType"> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> <xs:element name="publisher" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="Book" type="BookType"/> </xs:schema> xs:redefine przykład <xs:redefine schemaLocation="LibraryBook.xsd"> <xs:complexType name="BookType"> <xs:complexContent> <xs:extension base="BookType"> <xs:sequence> <xs:element name="summary" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:redefine> Wartości unikalne i klucze W schematach można wymusić, by pewne wartości w dokumencie były unikalne Do wymuszania unikalności służą elementy schematu: xs:unique i xs:key Podelement xs:selector określa zakres, w jakim wartości mają być unikalne Podelement(y) xs:field określa wartość, która ma być unikalna, musi być elementem o prostej zawartości lub atrybutem; dla xs:key wartość musi być niepusta xs:unique, xs:key <xs:unique name="studenci_unique"> <xs:selector xpath="studenci/student"/> <xs:field xpath="imie"/> <xs:field xpath="nazwisko"/> </xs:unique>

<xs:key name="studenci_key"> <xs:selector xpath="studenci/student"/> <xs:field xpath="nr-indeksu"/> </xs:key> Referencje W schemacie można także wymusić, aby pewne wartości w dokumencie były równe wartościom występującym w innym miejscu dokumentu

<xs:keyref name="grupy_studenci_ref" refer="studenci_key"> <xs:selector xpath="grupy/grupa/student"/> <xs:field xpath="@ref"/> </xs:keyref> xs:any Umożliwia dodanie w dokumencie XML elementów niezdefiniowanych w schemacie Element nadrzędny – xs:choose, xs:sequence

<xs:element name="book"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> <xs:any minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>

xs:anyAttribute Umożliwia dodanie w dokumencie XML atrybutów niezdefiniowanych w schemacie <xs:element name="book"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> </xs:sequence> <xs:anyAttribute/> </xs:complexType> </xs:element>


Ćwiczenie 2 XPath XPath – XML Path Language� Model danych XPath Modelowanie dokumentu przy pomocy drzewa: węzeł root, węzły elementów, węzły atrybutów, węzły tekstowe, węzły instrukcji przetwarzania, węzły komentarzy, węzły przestrzeni nazw.

W XPath element zewnętrzny zawierający wszystkie inne elementy jest korzeniem drzewa (nie jest to element główny), a kolejne podelementy (wraz z instrukcjami, atrybutami, komentarzami i instrukcjami przetwarzania) są jego węzłami. Budowa wyrażeń XPath Wyrażenia XPath umożliwiają dokonywanie operacji na zawartości dokumentu XML polegających na przetwarzaniu informacji tekstowych oraz badaniu drzewiastej struktury dokumentu, mogą zwracać następujące typy: node-set (zbiór węzłów), boolean (logiczna), number (liczba), string (łańcuch znaków). Węzeł bieżący (context node). Wartość wyrażenia zależy od kontekstu (miejsca w drzewiastej strukturze dokumentu). Location Path Ścieżka XPath złożona z kroków: Ścieżka względna: krok/krok/krok Ścieżka bezwzględna: /krok/krok/krok Opis kroku: oś::test-węzła[predykat1] [predykat2]… oś: kierunek na drzewie węzłów, test-węzła: wybór węzła po rodzaju, typie, nazwie, predykat: opcjonalny filtr Przykłady: /child::sprawozdanie/child::dane child::pozycja[attribute::waluta=„$"] Drzewo węzłów Powiązania węzła Test węzła Każda oś posiada domyślny typ węzła i do niego odnosi się test. Podstawowe typy węzłów: dla osi attribute – atrybut, dla osi namespace – przestrzeń nazw, dla pozostałych osi – element.

Testy: nazwa węzła,

  • - wszystkie węzły podstawowego typu

node() text() comment() processing-instruction() processing-instruction(target-name) Predykat Wybiera węzły z danego zbioru węzłów. Wybiera węzeł jeśli wartością wyrażenia jest prawda, a nie wybiera, jeśli fałsz. Ograniczony jest nawiasami kwadratowymi [ i ].

Interpretacja dla różnych wartości wyrażeń: number – prawda, gdy równy pozycji węzła w kontekście, string – prawda, gdy łańcuch niepusty, node-set – prawda gdy zbiór węzłów nie jest pusty. Przykłady ścieżek child::dane – wybiera elementy dane będące dziećmi węzła kontekstowego, child::* - wybiera wszystkie dzieci węzła kontekstowego child::text() - wybiera wszystkie dzieci węzła kontekstowego będące węzłami tekstowymi, child::node() - wybiera wszystkie dzieci węzła kontekstowego bez względu na typ, attribute::waluta - wybiera atrybut o nazwie waluta węzła kontekstowego, attribute::* - wybiera wszystkie atrybuty węzła kontekstowego, ancestor::wartość - wybiera wszystkich przodków węzła kontekstowego będącymi elementami wartość, self::dane – wybiera węzeł kontekstowy, jeśli jest nim element dane, w przeciwnym wypadku zwraca pusty zbiór Zapis skrócony Można stosować różne skróty notacyjne: child:: - domyśla oś - można pominąć, @ - attribute:: // - /descendant-or-self::node()/ . - self::node() .. - parent::node()

Zapis pełny a skrócony – przykład: .//dane self::node()/descendant-or-self::node()/child::dane Przykłady ścieżek (notacja skrócona)

  • - wybiera wszystkie dzieci węzła kontekstowego,

text() – wybiera wszystkie dzieci węzła kontekstowego będące węzłem tekstowym, @* - wybiera wszystkie atrybuty węzła kontekstowego,

  • /dane – wybiera wszystkie elementy dane będące wnukami węzła kontekstowego,

//dane – wybiera wszystkie wystąpienia elementu dane w dokumencie ../@waluta – wybiera atrybut waluta węzła rodzica względem węzła kontekstowego pozycja[@waluta="PLN"] – wybiera wszystkie węzły pozycja będące dziećmi węzła kontekstowego, posiadające atrybut waluta o wartości PLN, pozycja[@waluta] – wybiera wszystkie węzły pozycja będące dziećmi węzła kontekstowego, posiadające atrybut waluta, //pozycja[@*] – wybiera wszystkie elementy pozycja posiadające atrybuty, //okres[.=”Marzec”] – wybranie wszystkich elementów okres, których wartością jest Marzec, //pozycja[okres=”Marzec”] – wybranie elementu pozycja, którego podelement okres ma wartość Marzec Operatory i funkcje Predykat mogą zawierać: operatory logiczne: and (koniunkcja), or (alternatywa), not (negacja) operatory relacyjne: > (większy), >= (większy bądź równy), < (mniejszy), <= (mniejszy bądź równy), = (równy), != (różny) operatory numeryczne: +, -, *, div (dzielenie), mod (reszta z dzielenia), funkcje: operujące na zbiorach węzłów, tekstowe, operujące na wartościach logicznych, działające na liczbach. Funkcje na zbiorach węzłów - 1 position() - zwraca numer wystąpienia węzła-dziecka w gałęzi drzewa (a nie w całym dokumencie) Funkcje na zbiorach węzłów - 2 last() – wybiera ostatni węzeł potomny węzła kontekstowego, count(zbiór węzłów) – zwraca liczbę węzłów z zbiorze,

Korzystanie z funkcji position() może okazać się niewygodnym rozwiązaniem. W przypadku dokonywania operacji porównania można usunąć tekst „position()=”. Przykłady funkcji //dane[position()=2] – dostęp do drugiego wystąpienia elementu dane, inaczej //dane[2] //dane[position()>2] – dostęp do trzeciego i kolejnego wystąpienia elementu dane //dane[position()<=3] – dostęp do pierwszych trzech wystąpień elementu dane //*[position()=2] – dostęp do wszystkich drugich wystąpień elementów, inaczej //*[2] //following::pozycja[3] – dostęp do wszystkich węzłów następujących po trzecim wystąpieniu elementu pozycja proceding-sibling::pozycja[3] to samo, co pozycja[2] – pierwsze to niepotrzebnie złożone wyrażenie pozycja[position() > 2 and position() != last()] - od trzeciego wystąpienia oprócz ostatniego Funkcje tekstowe concat(ciąg1, ciąg2, ...) – składanie łańcuchów w jedną całość contains(ciąg1, ciąg2) – umożliwia sprawdzenie czy ciąg 1 zawiera ciąg2 normalize-space(ciąg) – powoduje wycięcie niepotrzebnych białych znaków z ciągu starts-with(ciąg1, ciąg2) – umożliwia sprawdzenie czy ciąg1 zaczyna się od ciągu2 string-length(ciąg) – zwraca długość łańcucha substring(ciąg, liczba, długość) – powoduje wycięcie określonego łańcucha znaków z ciągu substring-after(ciąg1, ciąg2) – zwraca łańcuch znaków znajdujących się w ciągu1 po ciągu2 substring-before(ciąg1, ciąg2) – analogicznie ale przed translate(ciag, stareznaki, noweznaki) – zamienia stareznaki na noweznaki w danym ciągu string() – umożliwia dokonanie konwersji na typ znakowy Przykłady funkcji Funkcje operujące na wartościach logicznych Grupa funkcji dotyczących przetwarzania wartości logicznych: false() – zwraca wartość false true() - zwraca wartość true not() – tworzy negację dla wyrażenia logicznego boolean() – konwertuje dowolny typ na typ logiczny boolean(liczba) = true jeżeli liczba różna od 0, boolean(tekst) = true jeżeli tekst nie jest pusty

Przykład funkcji: boolean(//pozycja[1]/wartość > //pozycja[2]/wartość)=true() – czy prawdą jest, że wartość z pierwszego elementu pozycja jest większa niż wartość z drugiego elementu pozycja Funkcje działające na liczbach Standard XPath zawiera grupę funkcji przetwarzających liczby: ceiling(liczba) – zwraca liczbę całkowitą, równa wzwyż, floor(liczba) – zwraca liczbę całkowitą, równa w dół, round(liczba) – zwraca liczbę całkowitą, równa do najbliższej, sum(zbiór liczb) – zwraca wartość sumowania, number() – konwertuje dowolny obiekt na typ liczbowy, Przykłady funkcji Przykłady //pozycja[wartość*1.22 >1000] – wybranie elementów pozycja, dla których iloczyn wartość i liczba 1,22 jest większy od 1000 //pozycja[wartość < 500]/okres – wybranie elementów okres będących dziećmi elementu pozycja, dla których element wartość jest mniejsza od 500 //pozycja[1]/wartość + //pozycja[2]wartość – oznacza sumę elementów wartość w elementach pozycja będących na dwu pierwszych miejscach w danym elemencie drzewa following-sibling::*[1]/wartość div preceding-sibling::*[1]/wartość - oznacza iloraz liczby zawartej w kolejnym elemencie wartość i liczby zawartej w poprzednim elemencie wartość //pozycja[wartość mod 1000=0] – oznacza wybranie elementów pozycja, dla których wartość elementu wartość jest wyrażona w pełnych tysiącach, //okres[.='Luty'] – wybranie elementu okres, którego wartością jest Luty //pozycja[okres='Luty'] – wybranie elementu pozycja którego podelement okres ma wartość Luty //pozycja[okres < 'H']/wartość – wybranie elementu wartość znajdującego się w elemencie pozycja zawierającego element okres zaczynający się od liter od 'A' do 'G' //pozycja[following:wartość = 1000] – wybranie elementu pozycja dla którego wartość kolejnego elementu wartość wynosi 1000 pozycja[contains(okres,'erwie')] – wybranie elementu pozycja którego podelement okres zawiera tekst 'erwie' (Czerwiec) Wyszukiwanie poprzez zawartość elementu Wyszukiwanie poprzez wartość atrybutu Ćwiczenia Posługując się XPath Visualizerem (http://www.vbxml.com/xpathvisualizer/) opisz jaki będzie wynik działania poszczególnych wyrażeń XPath (plik sprawozdanie.xml): Ćwiczenia Wyszukaj następujące węzły z pliku spis.xml: Ograniczenia języka XPath

XPath nie posiada mechanizmów do:

wyszukiwania łańcuchów tekstów rozciągających się na kilka elementów wskazywania na znaczniki (początkowy lub końcowy) wyszukiwania jednostek i sekcji CDATA oznaczania punktów (określonych miejsc w tekście) lub zakresów (obszarów pomiędzy dwoma punktami)

ograniczenia spowodowane głównie przez fakt traktowania przez język XPath dokumentu XML jako drzewa węzłów a nie jako zbioru tekstowego

XSLT Budowa dokumentu XSLT Budowa XSLT Tworzenie reguł Przykład <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="olimpiady.xsl"?> <korzen> </korzen> Olimpiady.xsl: xsl:value-of wyświetlanie informacji zawartych w atrybutach:

Igrzyska Olimpijskie <xsl:value-of select="igrzyskaOlimpijskie/@miasto"/> <xsl:value-of select="igrzyskaOlimpijskie/@rok"/>

Ćwiczenie utwórz początkową wersję szablonu dla pliku Sydney2000.xml, powiąż go z dokumentem XML, wyświetl informacje zawarte a atrybutach miasto i rok elementu igrzyskaOlimpijskie. Budowanie innych szablonów <xsl:template match="/"> … <xsl:apply-templates select="igrzyskaOlimpijskie/dyscyplina"/> <xsl:apply-templates select="igrzyskaOlimpijskie/dyscyplina/plec/konkurencja"/> <xsl:apply-templates select="igrzyskaOlimpijskie/dyscyplina/plec"/> … </xsl:template>

<xsl:template match="dyscyplina"> <xsl:value-of select="./@nazwa"/>
</xsl:template> Ćwiczenie na podstawie przykładu z poprzedniej strony zbuduj szablon dla dyscypliny, dopisz szablony dla konkurencji (size=”4”) i płci (size=”3”) Wynik Powstała lista nie mająca nic wspólnego z hierarchią dokumentu – trzeba zmienić podejście. Przykład <xsl:template match="/"> … <xsl:apply-templates select="igrzyskaOlimpijskie/dyscyplina/plec/konkurencja"/> … </xsl:template>

<xsl:template match="konkurencja"> Dyscyplina: <xsl:value-of select="../../@nazwa"/>
Konkurencja: <xsl:value-of select="@nazwa"/>
Płeć: <xsl:value-of select="../@nazwa"/>

</xsl:template> Ćwiczenie zbuduj szablon na podstawie poprzedniego przykładu, dodaj szablony dla złotych, srebrnych i brązowych medalistów według schematu: <xsl:template match="zloto">

<xsl:value-of select="nazwisko"/>
<xsl:value-of select="panstwo"/>
<xsl:value-of select="wynik"/>

</xsl:template> xsl:attribute konstrukcja xsl:attribute służy do wstawiania atrybutów do elementów, np.: <img> <xsl:attribute name="src"> <xsl:value-of select="zdjecie/@nazwaPliku"/> </xsl:attribute> <xsl:attribute name="alt"> <xsl:value-of select="zdjecie/@alt"/> </xsl:attribute> </img> xsl:if test konstrukcja xsl:if test umożliwia tworzenie warunków, jeśli obliczona wartość atrybutu test jest: true - zawartość elementu if jest przetwarzana false – zawartość elementu if jest ignorowana wyrazenie_tekstowe jest dowolną konstrukcją języka XPath <xsl:if test="wyrazenie_tekstowe"> … </xsl:if> xsl:if test – wartość atrybutu test Wartość jest zamieniana na typ boolean: liczba – jeśli zero albo NaN (nie-liczba) to false, w przeciwnym razie true, zbiór węzłów – jeśli pusty to false, inaczej true, string – jeśli pusty to false, inaczej true. xsl:choose jeśli istnieje potrzeba skorzystania z wyboru wielokrotnego zamiast konstrukcji xsl:if można zastosować xsl:choose: <xsl:choose> <xsl:when test="wyr1"> ... </xsl:when> <xsl:when test="wyrN"> ... </xsl:when> <xsl:otherwise> ... </xsl:otherwise> </xsl:choose> xsl:for-each, xsl:sort Element xsl:for-each umożliwia tworzenie pętli. Napotykając ten znacznik, procesor XSLT przetwarza wszystkie węzły odpowiadające podanemu w atrybucie select wzorcowi, za każdym razem zmieniając bieżący węzeł. <xsl:for-each select="wzorzec"> ... </xsl:for-each> Element może dodatkowo zawierać kilka początkowych elementów xsl:sort, które porządkują zbiór węzłów przed przetwarzaniem. Sortowanie statyczne Sortowanie - przykład <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="ssaki.xsl"?> <ssaki> <gatunki> <nazwa>Delfin</nazwa> <nazwa>Człowiek</nazwa> <nazwa>Goryl</nazwa> <nazwa>Szympans</nazwa> <nazwa>Wielbłąd</nazwa> <nazwa>Lama</nazwa> <nazwa>Łoś</nazwa> </gatunki> </ssaki> Sortowanie – przykład c. d. <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">

Ssaki:

<xsl:apply-templates />

</xsl:template>

<xsl:template match="gatunki">

<xsl:for-each select="nazwa">
  	<xsl:sort select="." />

<xsl:value-of select="."/>

  	
</xsl:for-each>

</xsl:template>

</xsl:stylesheet> Numerowanie Kontrola postaci


Order

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:element name="order">
		<xs:annotation>
			<xs:documentation>Represents Online Order for Noble Furniture Inc.</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element name="order-no">
					<xs:simpleType>
						<xs:restriction base="positiveInteger_5_digit">
							<xs:minExclusive value="10000"/>
							<xs:maxExclusive value="100000"/>
							<xs:totalDigits value="5"/>
						</xs:restriction>
					</xs:simpleType>
				</xs:element>
				<xs:element name="order-date" type="xs:date"/>
				<xs:element name="order-time" type="xs:time"/>
				<xs:element name="order-office-location" type="string_255"/>
				<xs:element name="order-address" type="orderAddressType"/>
				<xs:element name="items">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="item" type="itemType" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="payment">
					<xs:complexType>
						<xs:choice>
							<xs:element name="creditCard-details" type="creditCardPayType"/>
							<xs:element name="cheque-details" type="chequePayType"/>
						</xs:choice>
						<xs:attribute ref="paymentCode"/>
					</xs:complexType>
				</xs:element>
				<xs:element name="deliveryWithin">
					<xs:complexType>
						<xs:attribute ref="deliveryDays"/>
					</xs:complexType>
				</xs:element>
				<xs:element name="comments" type="xs:string" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="string_255">
		<xs:restriction base="xs:string">
			<xs:maxLength value="255"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="positiveInteger_5_digit">
		<xs:restriction base="xs:positiveInteger">
			<xs:minInclusive value="10000"/>
			<xs:maxExclusive value="100000"/>
			<xs:totalDigits value="5"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="phoneType">
		<xs:restriction base="xs:string">
			<xs:pattern value="\d{3}-\d{3}-\d{4}"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="itemCodeType">
		<xs:restriction base="xs:string">
			<xs:pattern value="[A-Z]{2}-\d{8}"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="woodType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="oak"/>
			<xs:enumeration value="cherry"/>
			<xs:enumeration value="walnut"/>
			<xs:enumeration value="maple"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="stainType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="honey"/>
			<xs:enumeration value="walnut"/>
			<xs:enumeration value="natural"/>
			<xs:enumeration value="seely"/>
			<xs:enumeration value="cherry"/>
			<xs:enumeration value="washington cherry"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="wood_stain_type">
		<xs:union memberTypes="woodType stainType"/>
	</xs:simpleType>
	<xs:attribute name="itemCategory">
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:enumeration value="WOODEN"/>
				<xs:enumeration value="STAIN"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:attribute>
	<xs:attribute name="paymentCode">
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:enumeration value="CREDIT CARD"/>
				<xs:enumeration value="CHEQUE"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:attribute>
	<xs:attribute name="deliveryDays">
		<xs:simpleType>
			<xs:restriction base="xs:positiveInteger">
				<xs:enumeration value="3"/>
				<xs:enumeration value="5"/>
				<xs:enumeration value="7"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:attribute>
	<xs:attributeGroup name="contactInfo">
		<xs:attribute name="phone" type="phoneType" use="optional"/>
		<xs:attribute name="email" type="xs:string" use="optional"/>
	</xs:attributeGroup>
	<xs:group name="contactName">
		<xs:sequence>
			<xs:element name="firstName" type="xs:string"/>
			<xs:element name="lastName" type="xs:string"/>
		</xs:sequence>
	</xs:group>
	<xs:complexType name="addressType">
		<xs:sequence>
			<xs:element name="address" type="string_255"/>
			<xs:element name="city" type="string_255"/>
			<xs:element name="state">
				<xs:simpleType>
					<xs:restriction base="string_255">
						<xs:minLength value="2"/>
						<xs:maxLength value="2"/>
						<xs:pattern value="[A-Z]{2}"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
			<xs:element name="zip" type="positiveInteger_5_digit"/>
		</xs:sequence>
		<xs:attributeGroup ref="contactInfo"/>
	</xs:complexType>
	<xs:complexType name="billingAddressType">
		<xs:complexContent>
			<xs:extension base="addressType">
				<xs:sequence>
					<xs:group ref="contactName"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="shippingAddressType">
		<xs:complexContent>
			<xs:extension base="billingAddressType">
				<xs:sequence>
					<xs:element name="locationHint" type="xs:string"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="orderAddressType">
		<xs:all>
			<xs:element name="billing-address" type="billingAddressType"/>
			<xs:element name="shipping-address" type="shippingAddressType" minOccurs="0"/>
		</xs:all>
	</xs:complexType>
	<xs:complexType name="itemType">
		<xs:sequence>
			<xs:element name="item-Code" type="itemCodeType"/>
			<xs:element name="name" type="wood_stain_type"/>
			<xs:element name="description" type="xs:string"/>
			<xs:element name="qty" type="xs:positiveInteger"/>
			<xs:element name="price" type="xs:decimal"/>
		</xs:sequence>
		<xs:attribute ref="itemCategory"/>
	</xs:complexType>
	<xs:complexType name="creditCardPayType">
		<xs:sequence>
			<xs:element name="type">
				<xs:simpleType>
					<xs:restriction base="xs:string">
						<xs:enumeration value="MASTER CARD"/>
						<xs:enumeration value="VISA CARD"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
			<xs:element name="cardNo" type="xs:positiveInteger"/>
			<xs:element name="expDate" type="xs:date"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="chequePayType">
		<xs:sequence>
			<xs:element name="bankName" type="string_255"/>
			<xs:element name="chequeNo" type="xs:positiveInteger"/>
			<xs:element name="date" type="xs:date"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>


<?xml version="1.0" encoding="UTF-8"?>
<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="order.xsd">
	<order-no>10010</order-no>
	<order-date>2005-02-13</order-date>
	<order-time>14:20:00</order-time>
	<order-office-location>B-20, National Avenue, San Jose</order-office-location>
	<order-address>
		<billing-address email="jim@carry.com" phone="777-888-9999">
			<address>A-101, New Hill building</address>
			<city>New York</city>
			<state>NY</state>
			<zip>89865</zip>
			<firstName>Jim</firstName>
			<lastName>Carry</lastName>
		</billing-address>
		<shipping-address email="james@bond.com" phone="565-556-5454">
			<address>007, east world park</address>
			<city>San Fransisco</city>
			<state>CA</state>
			<zip>85856</zip>
			<firstName>James</firstName>
			<lastName>Bond</lastName>
			<locationHint>heavan</locationHint>
		</shipping-address>
	</order-address>
	<items>
		<item itemCategory="WOODEN">
			<item-Code>AA-58585858</item-Code>
			<name>oak</name>
			<description>best quality</description>
			<qty>2</qty>
			<price>58</price>
		</item>
		<item itemCategory="STAIN">
			<item-Code>AA-78778788</item-Code>
			<name>walnut</name>
			<description>low cost</description>
			<qty>5</qty>
			<price>25</price>
		</item>
	</items>
	<payment paymentCode="CREDIT CARD">
		<creditCard-details>
			<type>MASTER CARD</type>
			<cardNo>2432423</cardNo>
			<expDate>2006-08-13</expDate>
		</creditCard-details>
	</payment>
	<deliveryWithin deliveryDays="3"/>
	<comments>this is final order..</comments>
</order>

Pielegniarki

BestMedicalCatalog.xml

<?xml version="1.0" encoding="UTF-8"?>
<tns:Catalog xmlns:tns="http://www.bestmedical.com/xsd/2005/catalog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bestmedical.com/xsd/2005/catalog
 BestMedicalCatalog.xsd">
	<tns:Equipment tns:unitprice="4.75" tns:EquipmentID="AIR5089">
		<tns:Name>Metal Twist Fit Connector Set - Air Release  Valve </tns:Name>
		<tns:Category>Blook Pressure</tns:Category>
		<tns:Description></tns:Description>
	</tns:Equipment>
	
	<tns:Equipment tns:unitprice="1223.75" tns:EquipmentID="UAS6109">
		<tns:Name>Legend Ultrasound </tns:Name>
		<tns:Category>Ultrasound</tns:Category>
		<tns:Description>This dual frequency clinical ultrasound system features: -   Ultrasound features include 1 and 3.3 MHz frequencies, 10%, 20% 50% and Continuous Duty Cycle selections with Head Warming. - Bright back-lit LCD display.
		</tns:Description>
	</tns:Equipment>
	
	<tns:Equipment tns:unitprice="22.00" tns:EquipmentID="COF9114">
		<tns:Name>Compact Oxygen Flowmeter    </tns:Name>
		<tns:Category>Oxygen Air Flowmeters</tns:Category>
		<tns:Description>The flow tube has a lifetime warranty and the needle valve  carries a five year warranty. The flow tube has a lifetime warranty and the needle valve carries a five year warranty.
		</tns:Description>
	</tns:Equipment>

	<tns:Equipment tns:unitprice="28.50" tns:EquipmentID="COF0072">
		<tns:Name>Chrome Body Oxygen Flowmeter </tns:Name>
		<tns:Category>Oxygen Air Flowmeters</tns:Category>
		<tns:Description>Highly accurate needle valves insure precise flow-settings the first time....every time.
		</tns:Description>
	</tns:Equipment>


	<tns:Equipment tns:unitprice="27.00" tns:EquipmentID="BMM1144">
		<tns:Name>Nurse Assist S-500 Chair Sensor Pad </tns:Name>
		<tns:Category>Bed Monitors</tns:Category>
		<tns:Description>The Nurse Assist chair pad is thinner and more flexible than any other sensor pad, affording the patient or resident absolute comfort while maintaining added protection from falls.
When used with a Nurse Assist monitor, the patented Reverse Polarity Testing (RPT) continuously verifies that the sensor pad is functioning properly.
		</tns:Description>
	</tns:Equipment>

	<tns:Equipment tns:unitprice="34.40" tns:EquipmentID="COF5073">
		<tns:Name>Nurse Assist S-1000 Bed Exit Pad</tns:Name>
		<tns:Category>Bed Monitors</tns:Category>
		<tns:Description>The Nurse Assist bed pad is thinner and more flexible than any other sensor pad, affording the patient or resident absolute comfort while maintaining added protection from falls.
		</tns:Description>
	</tns:Equipment>


</tns:Catalog>

BestMedicalCatalog.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2009 sp1 (http://www.altova.com) by Filip (Com2) -->
<xs:schema xmlns:tns="http://www.bestmedical.com/xsd/2005/catalog" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.bestmedical.com/xsd/2005/catalog" elementFormDefault="qualified" attributeFormDefault="qualified">
	<xs:simpleType name="EquipmentIDType">
		<xs:restriction base="xs:string">
			<xs:minLength value="7"/>
			<xs:maxLength value="7"/>
			<xs:pattern value="\c{4}\d{3}"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="EquipmentType">
		<xs:sequence>
			<xs:element ref="tns:Name"/>
			<xs:element ref="tns:Category"/>
			<xs:element ref="tns:Description"/>
		</xs:sequence>
		<xs:attribute ref="tns:EquipmentID"/>
		<xs:attribute name="unitprice" type="xs:double" use="required"/>
	</xs:complexType>
	<xs:element name="Category">
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="50"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Description" type="xs:string"/>
	<xs:element name="Name">
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="100"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Equipment" type="tns:EquipmentType"/>
	<xs:element name="Catalog" type="tns:CatalogType"/>
	<xs:complexType name="CatalogType">
		<xs:sequence>
			<xs:element ref="tns:Equipment" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:attribute name="EquipmentID" type="tns:EquipmentIDType"/>
</xs:schema>

EquipmentOrder.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2005 sp2 U (http://www.altova.com)-->
<tns:EquipmentUsageReport xmlns:tns="http://www.getwell.com/purchase/xsd/rep_a21" xmlns:best="http://www.bestmedical.com/xsd/2005/catalog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.getwell.com/purchase/xsd/rep_a21
EquipmentOrder.xsd">
	<tns:Period>
		<tns:FromDate>2005-01-01</tns:FromDate>
		<tns:ToDate>2005-02-15</tns:ToDate>
	</tns:Period>
	<tns:Nurses>
		<tns:Nurse>
			<tns:Id>1</tns:Id>
			<tns:Name>Rose</tns:Name>
		</tns:Nurse>
		<tns:Nurse>
			<tns:Id>2</tns:Id>
			<tns:Name>Jill</tns:Name>
		</tns:Nurse>
		<tns:Nurse>
			<tns:Id>3</tns:Id>
			<tns:Name>Cathy</tns:Name>
		</tns:Nurse>
		
	</tns:Nurses>
	
	<tns:EquipmentsUsage>
		<tns:EquipmentID>COF0072</tns:EquipmentID>
		<best:Description>Chrome Body Oxygen Flowmeter</best:Description>
		<tns:OrderedBy>2</tns:OrderedBy>
		<tns:NoOfUnits>3</tns:NoOfUnits>
	</tns:EquipmentsUsage>
	
	<tns:EquipmentsUsage>
		<tns:EquipmentID>BMM1144</tns:EquipmentID>
		<best:Description>Nurse Assist S-500 Chair Sensor Pad </best:Description>
		<tns:OrderedBy>3</tns:OrderedBy>
		<tns:NoOfUnits>25</tns:NoOfUnits>
	</tns:EquipmentsUsage>
		
</tns:EquipmentUsageReport>

EquipmentOrder.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2009 sp1 (http://www.altova.com) by Filip (Com2) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.getwell.com/purchase/xsd/rep_a21" xmlns:best="http://www.bestmedical.com/xsd/2005/catalog" targetNamespace="http://www.getwell.com/purchase/xsd/rep_a21" elementFormDefault="qualified" attributeFormDefault="qualified">
	<xs:import namespace="http://www.bestmedical.com/xsd/2005/catalog" schemaLocation="BestMedicalCatalog.xsd"/>
	<xs:simpleType name="IdType">
		<xs:restriction base="xs:integer">
			<xs:totalDigits value="7"/>
			<xs:fractionDigits value="0"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="PeriodType">
		<xs:all>
			<xs:element name="FromDate" type="xs:date"/>
			<xs:element name="ToDate" type="xs:date"/>
		</xs:all>
	</xs:complexType>
	<xs:complexType name="NurseType">
		<xs:sequence>
			<xs:element name="Id" type="tns:IdType"/>
			<xs:element name="Name">
				<xs:simpleType>
					<xs:restriction base="xs:string">
						<xs:minLength value="2"/>
						<xs:maxLength value="50"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NursesType">
		<xs:sequence>
			<xs:element name="Nurse" type="tns:NurseType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="EquipmentUsageType">
		<xs:sequence>
			<xs:element name="EquipmentID" type="best:EquipmentIDType"/>
			<xs:element ref="best:Description"/>
			<xs:element name="OrderedBy" type="tns:IdType"/>
			<xs:element name="NoOfUnits" type="xs:integer"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="EquipmentUsageReportType">
		<xs:sequence>
			<xs:element name="Period" type="tns:PeriodType"/>
			<xs:element name="Nurses" type="tns:NursesType"/>
			<xs:element name="EquipmentsUsage" type="tns:EquipmentUsageType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:element name="EquipmentUsageReport" type="tns:EquipmentUsageReportType">
		<xs:unique name="Unique_Equipment">
			<xs:selector xpath="tns:EquipmentsUsage"/>
			<xs:field xpath="tns:EquipmentID"/>
			<xs:field xpath="tns:OrderedBy"/>
		</xs:unique>
		<xs:key name="Key_NurseID">
			<xs:selector xpath="tns:Nurses/tns:Nurse "/>
			<xs:field xpath="tns:Id"/>
		</xs:key>
		<xs:keyref name="KeyRef_NurseID" refer="tns:Key_NurseID">
			<xs:selector xpath="tns:EquipmentsUsage "/>
			<xs:field xpath="tns:OrderedBy"/>
		</xs:keyref>
	</xs:element>
</xs:schema>