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