1 Politechnika Poznańska Instytut Automatyki i Inżynierii

Transkrypt

1 Politechnika Poznańska Instytut Automatyki i Inżynierii
Politechnika Poznańska
Instytut Automatyki i Inżynierii Informatycznej
Zakład Bezpieczeństwa Systemów Informatycznych
przedmiot:
PROGRAMOWANIE W SIECI WWW - laboratorium
grupa docelowa:
INFORMATYKA, semestr 7, dzienne I-stopnia
Temat: XML, DTD, XSD, XSLT, XPath
Teoria (obowiązkowa):
XML: http://www.w3schools.com/xml/default.asp
DTD: http://www.w3schools.com/dtd/default.asp
XSD: http://www.w3schools.com/schema/default.asp (XMLSchema)
XSLT: http://www.w3schools.com/xsl/default.asp
Xpath: http://www.w3schools.com/xpath/default.asp
Cel:
Celem ćwiczenia jest stworzenie dokumentów XML, struktur DTD i XMLSchema,
transformacja dokumentu XML do dokumentu XHTML przy użyciu arkusza stylów XSLT.
Zadanie 1 (XML+DTD):
1. Stwórz dokument XML zawierający informacje o szpitalu, jego oddziałach i
pracownikach, poniższy przykład zawiera drobne błędy popraw je tak aby dokument
był „well formed”. Otwórz dokument w przeglądarce w jaki sposób jest wyświetlany?
<?xml version="1.0" encoding="UTF-8"?>
<SZPITAL NAZWA="SZPITAL POD NOSZAMI" ULICA="ZBAWIENIA 7" KOD="60-965"
MIASTO="POZNAN">
<ODDZIALY>
<ODDZIAL>
<NAZWA>ADMINISTRACJA</NAZWA>
<PRACOWNICY>
<PRACOWNIK ID_PRAC="120">
<NAZWISKO>SZPRYCHA</NAZWISKO>
<ETAT>SEKRETARKA</ETAT>
<PENSJA>999,50</PENSJA>
</PRACOWNIK>
</PRACOWNICY>
</ODDZIAL>
<ODDZIAL>
<NAZWA>KARDIOLOGIA</NAZWA>
<PRACOWNICY>
<PRACOWNIK ID_PRAC="320">
<NAZWISKO>SERDUCHO</NAZWISKO>
<ETAT>ORDYNATOR</ETAT>
<PENSJA>6500</PENSJA>
</PRACOWNIK>
<PRACOWNIK ID_PRAC="330">
1
<NAZWISKO>AORTA</NAZWISKO>
<ETAT>LEKARZ</ETAT>
<PENSJA>3850</PENSJA>
</PRACOWNIK>
</PRACOWNICY>
</ODDZIAL>
<ODDZIAL>
<NAZWA>DERMATOLOGIA</NAZWA>
<PRACOWNICY>
<PRACOWNIK ID_PRAC="550">
<NAZWISKO>SKORKA</NAZWISKO>
<ETAT>PIELEGNIARKA</ETAT>
<PENSJA>4580</PENSJA>
</PRACOWNIK>
<PRACOWNIK ID_PRAC="580">
<NAZWISKO>BLIZNA</NAZWISKO>
<ETAT>LEKARZ</PENSJA>7780</PENSJA></ETAT>
</PRACOWNIK>
<PRACOWNIK ID_PRAC="590">
<NAZWISKO>WYSYPKA</NAZWISKO>
<ETAT>STAZYSTA</ETAT>
<PENSJA>1208</PENSJA>
</PRACOWNIK>
</PRACOWNICY>
</ODDZIAL>
<ODDZIAL>
<NAZWA>PEDIATRIA</NAZWA>
<PRACOWNICY>
<PRACOWNIK ID_PRAC="220">
<NAZWISKO>GIPSOWY</NAZWISKO>
<ETAT>ORDYNATOR</ETAT>
<PENSJA>8080</PENSJA>
</PRACOWNIK>
<PRACOWNIK ID_PRAC="290">
<NAZWISKO>KULA</NAZWISKO>
<ETAT>ASYSTENT</ETAT>
<PENSJA>2371</PENSJA>
</PRACOWNIK>
<PRACOWNIK ID_PRAC="270">
<NAZWISKO>WYSTAWIONY</NAZWISKO>
<ETAT>LEKARZ</ETAT>
<PENSJA>4439,7</PENSJA>
</PRACOWNIK>
<PRACOWNIK ID_PRAC="260">
<NAZWISKO>NASTAWIONY</NAZWISKO>
<ETAT>LEKARZ</ETAT>
<PENSJA>5590</PENSJA>
</PRACOWNIK>
</PRACOWNICY>
</ODDZIAL>
<ODDZIAL>
<NAZWA>PATOMORFOLOGIA</NAZWAODDZIALU>
</ODDZIAL>
</ODDZIALY>
</SZPITAL>
2. Dodaj pracownika o nazwisku BOSS w oddziale ADMINISTRACJA (zwróć uwagę
na encję XML „&boss”) , czy można plik wyświetlić ?
<PRACOWNIK ID_PRAC="110">
<NAZWISKO>BOSS</NAZWISKO>
<ETAT>&boss;</ETAT>
<PENSJA>2140</PENSJA>
</PRACOWNIK>
2
3. W kolejnym kroku przygotuj strukturę DTD (ang. Document Type Definition), jeśli
nie wiesz jak wykorzystaj kod poniżej (zinterpretuj każdą linię kodu).
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE SZPITAL [
<!ELEMENT SZPITAL (ODDZIALY)>
<!ATTLIST SZPITAL NAZWA CDATA #REQUIRED ULICA CDATA #IMPLIED KOD CDATA #IMPLIED
MIASTO CDATA #FIXED "POZNAN">
<!ELEMENT ODDZIALY (ODDZIAL)+>
<!ELEMENT ODDZIAL (NAZWA, PRACOWNICY?)>
<!ELEMENT NAZWA (#PCDATA)>
<!ELEMENT PRACOWNICY (PRACOWNIK)+>
<!ELEMENT PRACOWNIK (NAZWISKO, ETAT, PENSJA)>
<!ATTLIST PRACOWNIK ID_PRAC ID #REQUIRED>
<!ELEMENT NAZWISKO (#PCDATA)>
<!ELEMENT ETAT (#PCDATA)>
<!ELEMENT PENSJA (#PCDATA)>
<!ENTITY boss "DYREKTOR SZPITAL">
]>
…
<SZPITAL NAZWA=…
Pierwszy przypadek przedstawia sytuacje w której struktura XML zawarta jest
wewnątrz pliku XML, niemniej struktura DTD może być osobnym plikiem np.
szpital.dtd (wtedy w pliku dtd nie otacza się definicji znacznikiem „<!DOCTYPE …
]>„, odwołanie do pliku dtd w pliku XML może być następujące (zwróć uwagę ze
znacznik ten nie wymaga zamknięcia />):
<!DOCTYPE SZPITAL SYSTEM „szpital.dtd”>
4. Wykorzystaj dowolny walidator plików XML i sprawdź poprawność dokumentu
szpital.xml
5. Dokonaj modyfikacji dokumentu, przeprowadź walidację i przywróć poprawną formę
dokumentu:
o jednemu z pracowników usuń znacznik <PENSJA>…</PENSJA>, przeprowadź
walidację, zapoznaj się z komunikatem błędu.
o pracownikowi BLIZNA zmień ID_PRAC na wartość „590” i ponownie
przeprowadź walidację, następnie przywróć poprawną formę dokumentowi.
Zadanie 2 (XML+XMLSchema):
1. Przygotuj dokument oddzialy.xml z wykorzystaniem poniższego kodu.
<?xml version="1.0" encoding="UTF-8"?>
<ODDZIALY>
<ODDZIAL ID="1">
<NAZWA>ADMINISTRACJA</NAZWA>
<ADRES>ZBAWIENIA 7a</ADRES>
</ODDZIAL>
<ODDZIAL ID="2">
3
<NAZWA>KARDIOLOGIA</NAZWA>
<ADRES>ZBAWIENIA 7c</ADRES>
</ODDZIAL>
<ODDZIAL ID="3">
<NAZWA>DERMATOLOGIA</NAZWA>
<ADRES>ZBAWIENIA 6</ADRES>
</ODDZIAL>
<ODDZIAL ID="4">
<NAZWA>PEDIATRIA</NAZWA>
<ADRES>FREDR 2</ADRES>
</ODDZIAL>
<ODDZIAL ID="5">
<NAZWA>PATOMORFOLOGIA</NAZWA>
<ADRES>ZACISZE 124</ADRES>
</ODDZIAL>
</ODDZIALY>
2. Następnie przygotuj plik oddzialy-schema.xml, jeśli nie wiesz jak skorzystaj z kodu
poniżej.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="www.sk-kari.put.poznan.pl"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
xmlns="www.sk-kari.put.poznan.pl"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ODDZIALY">
<xs:annotation>
<xs:documentation>Informacje odddzialach szpitala</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="ODDZIAL" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="NAZWA" type="xs:string"/>
<xs:element name="ADRES" type="xs:string"/>
</xs:sequence>
<xs:attribute name="ID" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
3. W pliku oddzialy.xml dodaj deklaracje wskazującą na dokument oddzialy-schema.xml
<ODDZIALY xmlns="www.sk-kari.put.poznan.pl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="www.sk-kari.put.poznan.pl oddzialy-schema.xml">
4. Wykorzystaj walidator http://tools.decisionsoft.com/schemaValidate/ do sprawdzenia
poprawności dokumentu XML i schematu XML.
5. Do znacznika <ODDZIAL>PATOMOFROLOGIA</ODDZIAL> dodaj atrybut
informujący, że dany oddział nie zatrudnia pracowników. Jako wartość atrybutu wpisz
literały „false” lub „0”.
4
<ODDZIAL ID="5" CZY_PRACOWNICY="false">
<NAZWA>PATOMORFOLOGIA</NAZWA>
<ADRES>ZACISZE 124</ADRES>
</ODDZIAL>
6. W pliku XMLSchema dodaj informację o atrybucie CZY_PRACOWNICY.
Bezpośrednio za definicją atrybutu ID. Następnie przeprowadź walidację dla wartości
literału „brak”, przywróć poprawną formę.
<xs:attribute name="CZY_PRACOWNICY" type="xs:boolean"/>
7. W dokumencie oddzialy.xml dodaj, po liście oddziałów, datę ostatniej wizytacji
komisji NFZ. Przed znacznikiem zamykającym </ODDZIALY> wprowadź kod:
...
<DATA_WIZYTACJI>2009-10-21</DATA_WIZYTACJI>
</ODDZIALY>
8. Do schematu dodaj definicję atrybutu <DATA_WIZYTACJI>, po definicji elementu
<ODDZIAL> umieść w pliku oddzialy-schema.xml poniższy kod:
<xs:element name="DATA_WIZYTACJI" type="xs:date"/>
9. Sprawdź poprawność dokumentu XML, wprowadź błędną datę, np. zastąp ją datą 31
lutego 2012. Czy walidator znajdzie błąd? Przywróć poprawną formę dokumentu.
10. Do każdego oddziału dodaj znacznik z adresem e-mail. Przykładowo, oddział
KARDIOLOGICZNY:
<ODDZIAL ID="20">
<NAZWA>KARDIOLOGIA</NAZWA>
<ADRES>ZBAWIENIA 7c</ADRES>
<EMAIL>[email protected]</EMAIL>
</ODDZIAL>
11. W schemacie dodaj definicję nowego znacznika i sprawdź dokument dokument. Gdzie
jest błąd ?
<xs:element name="EMAIL">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z\.]+@([a-zA-Z0-9]+\.)+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
12. Popraw wyrażenie regularne1 :
1
[a-zA-Z0-9\.]+@([a-zA-Z0-9]+\.)+[a-zA-Z]{2,6}
5
13. Na końcu dokumentu XML, po dacie wizytacji NFZ, dodaj znacznik przechowujący
ocenę komisji. Załóżmy, ocena może przyjmować tylko i wyłącznie wartości: nds, dst,
db, bdb.
...
<DATA_WIZYTACJI>2009-10-21</DATA_WIZYTACJI>
<OCENA_KOMISJI>bdb</OCENA_KOMISJI>
</ODDZIALY>
14. Dodaj do schematu definicję nowego znacznika i przeprowadź walidację dokumentu.
Poniższy kod umieść bezpośrednio po definicji elementu <DATA_WIZYTACJI>.
<xs:element name="OCENA_KOMISJI">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="ndst"/>
<xs:enumeration value="dst"/>
<xs:enumeration value="db"/>
<xs:enumeration value="bdb"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Zadanie 3 (XSL):
1. Przygotuj plik transform.xsl zawierający kod XSL służący do transformacji
dokumentu szpital.xml do postaci XHTML. Wypełnij plik następującym kodem:
<?xml version="1.0" encoding=" UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="SZPITAL">
<html>
<head>
<title>Lista pracownikow szpitala</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
2. W pliku szpital.xml dopisz powiązanie z arkuszem stylistycznym XSL. Następnie,
otwórz plik szpital.xml w przeglądarce i zaobserwuj wynik. Przeanalizuj źródło
zbudowanej strony XHTML. Co się stało ze znacznikami, dla których w arkuszu
stylistycznym nie znaleziono reguł ?
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
3. W arkuszy XSL dodaj regułę przetwarzającą nazwę szpitala. Odśwież dokument w
przeglądarce i zaobserwuj wynik.
<xsl:template match="SZPITAL">
6
<html>
<head>
<title> Lista pracownikow szpitala</title>
</head>
<body>
<h1><xsl:value-of select="@NAZWA"/></h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
4. W podobny sposób zmodyfikuj szablon dopasowywany do znacznika <SZPITAL> w
taki sposób, aby poprawnie wyświetlić adres i kod szpitala.
<xsl:template match="SZPITAL">
<html>
<head>
<title>Lista pracowników szpitala</title>
</head>
<body>
<h1><xsl:value-of select="@NAZWA"/></h1>
<h2><xsl:value-of select="@ULICA"/></h2>
<h2>
<xsl:value-of select="@KOD"/>
<xsl:value-of select="@MIASTO"/>
</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
5. Pod kodem pocztowym i nazwą miasta dodaj fragment statycznego tekstu:
…
</h2>
<xsl:text>Poniżej znajduje się lista oddziałów szpitala wraz z pracownikami każdego oddziału </xsl:text>
6. W szablonie umieść przetwarzanie znacznika <ODDZIAL> i zaobserwuj działanie
szablonu w przeglądarce.
<xsl:template match="ODDZIAL">
<div class="oddzial">
<xsl:number/>.<xsl:value-of select="NAZWA"/>
<table><xsl:attribute name="BORDER">1</xsl:attribute>
<tr>
<th>ID</th>
<th>NAZWISKO</th>
<th>ETAT</th>
<th>PENSJA</th>
</tr>
<xsl:apply-templates select="PRACOWNICY"/>
</table>
</div>
</xsl:template>
7. Dodaj przetwarzanie znacznika <PRACOWNIK> i zaobserwuj działanie szablonu w
przeglądarce.
<xsl:template match="PRACOWNIK">
<tr>
<td><xsl:value-of select="@ID_PRAC"/></td>
<td><xsl:value-of select="NAZWISKO"/></td>
<td><xsl:value-of select="ETAT"/></td>
7
<td><xsl:value-of select="PENSJA"/></td>
</tr>
</xsl:template>
8. Następnie ukryj tabelkę i zastąp ją tekstem „Brak pracowników” dla oddziałów, które
nie zatrudniają żadnych pracowników.
<xsl:template match="ODDZIAL">
<div class="oddzial">
<xsl:number/>.<xsl:value-of select="NAZWA"/>
<xsl:choose>
<xsl:when test="PRACOWNICY">
<table><xsl:attribute name="BORDER">1</xsl:attribute>
<tr>
<th>ID</th>
<th>NAZWISKO</th>
<th>ETAT</th>
<th>PENSJA</th>
</tr>
<xsl:apply-templates select="PRACOWNICY"/>
</table>
</xsl:when>
<xsl:otherwise>
<br/><em>Brak pracowników</em>
</xsl:otherwise>
</xsl:choose>
</div>
</xsl:template>
9. Następnie podświetl pracowników zatrudnionych na etacie LEKARZ kolorem
niebieskim. Wstaw w odpowiednie miejsce kod:
<xsl:if test=" ETAT=’LEKARZ’ ">
<xsl:attribute name="BGCOLOR">#ADDFFF</xsl:attribute>
</xsl:if>
8
Zadanie 4 (do samodzielnego wykonania):
Dana jest struktura DTD (w razie potrzeby można go poszerzyć). Przygotuj aplikację
prezentującą ofertę sklepu handlującego notebookami. Oferta sklepu przechowywana jest w
pliku XML, natomiast transformacja do pliku XHTML odbywa się z wykorzystaniem XSLT i
CSS. Aplikacja powinna prezentować informacje o firmie, posiadać (osobną) listę
producentów oraz cennik modeli. Lista producentów powinna być linkami do listy modeli
(anchorn). Wiersz listingu modeli powinien podświetlać się po najechaniu kursorem, ceny
promocyjne powinny być wyróżnione.
<!DOCTYPE FIRMA [
<!ELEMENT FIRMA (producenci)>
<!ATTLIST FIRMA nazwa CDATA #REQUIRED ulica CDATA #IMPLIED kod CDATA #IMPLIED miasto
CDATA #IMPLIED tel CDATA #IMPLIED email CDATA #IMPLIED website CDATA #IMPLIED>
<!ELEMENT producenci (producent)+>
<!ELEMENT producent (notebooks?)>
<!ATTLIST producent nazwa CDATA #REQUIRED>
<!ELEMENT notebooks (notebook)+>
<!ELEMENT notebook (foto,model,procesor,pamiec,ekran,cena)>
<!ATTLIST notebook czy_promocja CDATA #IMPLIED>
<!ELEMENT foto (#PCDATA)>
<!ELEMENT model (#PCDATA)>
<!ELEMENT procesor (#PCDATA)>
<!ELEMENT pamiec (#PCDATA)>
<!ELEMENT ekran (#PCDATA)>
<!ELEMENT cena (#PCDATA)>
]>
9

Podobne dokumenty