Wykład 04
Transkrypt
Wykład 04
Plan Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 04 T. Romańczukiewicz Jagiellonian University 2009/2010 T. Romańczukiewicz XML 04 Plan Plan 1 XSLT T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Plan 1 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Funkcje Podsumowanie T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne XSL XPath XSLT (ang. XSL Transformations jezyk ˛ do transformowania dokumentów XML do innych dokumentów XML XSL (ang. Extensible Stylesheet Language) HTML zawiera dobrze zdefiniowane znaczniki. Przegladarki ˛ wiedza˛ co one oznaczaja. ˛ Znaczniki HTML określaja˛ format w jakim dane sie˛ bed ˛ a˛ wyświetlane. CSS - arkusz stylów dla HTML. Określa jak konkretnie maja˛ wygladać ˛ elementy w przegladarce. ˛ W XML autor sam definiuje dowolne znaczniki. Aby je wyświetlić musi określić ich styl. Można użyć CSS dla XML tak jak to sie˛ robi dla HTML. Lepiej: XSL - arkusz stylów dla XML. Sam jest poprawnie zdefiniowanym dokumentem XML. XSLT - Jezyk ˛ transformacji dokumentów XML XPath - Jezyk ˛ do nawigacji w dokumentach XML XML-FO - (ang. Extensible Stylesheet Language Formatting Objects) jezyk ˛ służacy ˛ do formatowania danych z dokumentu XML do prezentacji. T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne XSLT XSLT Jest najważniejsza˛ cz˛eścia˛ XSL Transformuje jedne dokumenty XML w inne. Np zwykły XML w XHTML. Używa XPath do nawigacji po drzewie XML Może transformować dowolny element pliku XML na element (X)HMLT Dzieki ˛ XPath może wybierać poszczególne elementy. Może przestawiać elementy dodawać i zmieniać atrybuty, ukrywać i pokazywać elementy itd. Przekształceń można dokonywać po stronie klienta przegladarka, ˛ ale uwaga: starsze przegladarki ˛ moga˛ mieć problemy (FF≥ 3, IE≥ 6, Opera≥ 9) Javascript po stronie serwera (asp) gotowe programy np. xsltproc, API i parsery Xalan, libxslt. T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Przykład Listing 1: cdcatalog.xsl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Zamiast znacznika <xsl:stylesheet> można używać <xsl:transform>. T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Przykład Listing 2: cdcatalog.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> <catalog> <cd> <title>Black Sabbath</title> <artist>Black Sabbath</artist> <price>66.6</price> <year>1970</year> </cd> <cd> <title>Strange Highways</title> <artist>Dio</artist> <country>USA</country> <year>1994</year> </cd> <cd> <title>Ghost of a Rose</title> <artist>Blackmores Night</artist> <country>UK</country> <year>2003</year> </cd> </catalog> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Element template Elementem głównym XSLT jest <xsl:stylesheet> lub <xsl:transform> W arkuszu XSLT znajduje sie˛ co najmniej jeden element <template>. Posiada on atrybut match, którego wartość jest wyrażeniem XPath. Element ten wybiera kontekst (wezeł) ˛ dla dalszego przetwarzania danych. np <xsl:template match="/"> wybiera element główny Zawartość <xsl:template match="/"> definiuje elementy HTML, przy pomocy których dane z dokumentu XML bed ˛ a˛ prezentowane. Wewnatrz ˛ elemetów HTML można sie˛ odwoływać do pliku XML poprzez element: <xsl:value-of select="catalog/cd/title"/> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Przykład Listing 3: cdcatalog.xsl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet> Wypisze tylko pierwsza˛ pozycje˛ z katalogu. T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Element for-each i inne instrukcje sterujace ˛ Listing 4: cdcatalog.xsl 1 2 3 4 5 6 7 8 ... <xsl:for-each select="katalog/cd"> <tr> <td><xsl:vale-of select="tatle"/></td> <td><xsl:vale-of select="artist"/></td> </tr> </xsl:for-each> ... Atrybut select jest wyrażeniem XPath. Mże zawierać również dodaktowe filtry: Dozwolone filtry to <xsl:for-each select="catalog/cd[artist=’Dio’]"> = równe != nierówne < mniejsze > wieksze ˛ Inne instruckje sterujace: ˛ <xsl:if test="price > 6"> <xsl:sort select="artist"/> Uwaga: brak else Można użyć w for-each, for-each-group, apply-templates T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Instrukcja choose Listing 5: Instrukcja choose 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <xsl:choose> <xsl:when test="expression"> ... some output ... </xsl:when> <xsl:otherwise> ... some output .... </xsl:otherwise> </xsl:choose> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <xsl:choose> <xsl:when test="price > 10"> <td bgcolor="#ff00ff"> <xsl:value-of select="artist"/></td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="artist"/></td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne perform-sort Listing 6: Sortowanie 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <xsl:sort select="artist"/> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne applay-templates 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="cd"> <p> <xsl:apply-templates select="title"/> <xsl:apply-templates select="artist"/> </p> </xsl:template> <xsl:template match="title"> Title: <span style="color:#ff0000"> <xsl:value-of select="."/></span> <br /> </xsl:template> <xsl:template match="artist"> Artist: <span style="color:#00ff00"> <xsl:value-of select="."/></span> <br /> </xsl:template> </xsl:stylesheet> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Wynikowe drzewo XSLT przekształca jeden dokument XML w drugi. W wynikowym drzewie można tworzyć na kilka sposobów: W˛ezły moga˛ być wpisane w arkusz XSLT Można je tworzyć przy pomocy konstruktorów <xsar:element>, Moga˛ być przepisane z pliku źródłowego Listing 7: Elementy w arkuszu 1 2 3 4 5 6 <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> T. Romańczukiewicz XML 04 <xsar:comment> XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne xsl:element Listing 8: Elementy w arkuszu cd. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:for-each select="catalog/cd"> <xsl:element name="singer"> <xsl:value-of select="artist" /> </xsl:element> <br /> </xsl:for-each> </xsl:template> </xsl:stylesheet> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne xsl:attribute 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <picture> <xsl:attribute name="source"/> </picture> <picture> <xsl:attribute name="source"> <xsl:value-of select="images/name" /> </xsl:attribute> </picture> <xsl:attribute-set name="font"> <xsl:attribute name="fname">Arial</xsl:attribute> <xsl:attribute name="size">14px</xsl:attribute> <xsl:attribute name="color">red</xsl:attribute> </xsl:attribute-set> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Zastosowania tworzenia nowych elementów Wstawienie instrukcji przetwarzania lub komentarza. Wstawienie samych białych znaków. Wstawienie tekstu bez nadmiarowych białych znaków. Dynamicznie określana nazwa elementu lub atrybutu. Warunkowe wstawienie atrybutu. T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Listing 9: Przykłady zastosowań. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <!−− i n s t r u k c j a p r z e t w a z a n i a −−> <xsl:processing-instruction target="xml-stylesheet"> type="text/css" href="styl.css" </xsl:processing-instruction> <!−− D y n a m i cz n i e nadawana nazwa e l e m e n t u −−> <xsl:element name="h{max((count(ancestor-or-self::sekcja), 6))}"> ... </xsl:element> <!−− Warunkowe w s t a w i a n i e a t r y b u t u −−> <p> <xsl:if test="@stanowisko = kierownik"> <xsl:attribute name="class"> szef </xsl:attribute> </xsl:if> </p> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Szablony wartości atrybutu Szablony wartości atrybutu można wstawiać w atrybutach drzewa wynikowego <img src="{$image}/{$size}/{@id}.jpg"/> w niektórych instrukcjach XSLT <xsar:element name="h{count(ancestror-or-self::sekcja)}"> Cz˛eści stałe napisy kopiowane do wyniku Wyrażenia XPATH umieszczone miedzy ˛ {i} Reprezentacja tekstowa wyliczanej sekwencji T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne element output Element <xsl:output> definiuje format danych wynikowych. Musi sie˛ pojawić jako dziecko <xsl:stylesheet> lub <xsl:transform> method xml html text name version string encoding string omit-xml-declaration yes no standalone yes no indent yes no T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Zmienne Zmienne w XSLT sa˛ elementami postaci: 1 2 3 <xsl:variable name="name" select="expression"> <!−− C o n t e n t : t e m p l a t e −−> </xsl:variable> W zależności od tego gdzie sa˛ zdefiniowane moga˛ być zmiennymi lokalnymi (wewnatrz ˛ konkretnego szablonu) lub globalnymi (w całym arkuszu) Wartość zmiennej określa sie˛ poprzez zawartość elementu lub poprzez atrybut select Uwaga: Gdy raz określi sie˛ wartość zmiennej, nie można jej już modyfikować. T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Zmienne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <xsl:variable name="header"> <tr> <th>Element</th> <th>Description</th> </tr> </xsl:variable> <xsl:template match="/"> <table> <xsl:copy-of select="$header" /> <xsl:for-each select="reference/record"> <tr> <xsl:if category="XML"> <td><xsl:value-of select="element"/></td> <td><xsl:value-of select="description"/></td> </xsl:if> </tr> </xsl:for-each> </table> <br /> <table> <xsl:copy-of select="$header" /> <xsl:for-each select="table/record"> <tr> <xsl:if category="XSL"> <td><xsl:value-of select="element"/></td> <td><xsl:value-of select="description"/></td> </xsl:if> </tr> </xsl:for-each> </table> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne copy i copy-of 1 2 3 4 5 6 7 <xsl:copy use-attribute-sets="name-list"> <!−− C o n t e n t : t e m p l a t e −−> </xsl:copy> <xsl:copy-of use-attribute-sets="name-list"> <!−− C o n t e n t : t e m p l a t e −−> </xsl:copy-of> Element <xsar:copy> tworzy kopie˛ aktualnego wezła, ˛ ale bez dzieci i atrybutów. Przestrzeń nazw jest automatycznie kopiowana! Element <xsar:copy-of> tworzy kopie˛ aktualnego wezła ˛ wraz z dziećmi i atrybutami T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Szablony nazwane W szablonie atrybut name. call-template uruchamia. Bez zmiany wezła ˛ bieżacego ˛ (inaczej niż apply-templates). Możliwa rekurencja 1 2 3 4 5 6 7 8 9 10 11 12 <xsl:template name="opisz-element"> <p>Element o nazwie <xsl:value-of select="name()"/>.</p> </xsl:template> <xsl:template match="/"> <html><body> <h1>Wszystkie elementy:</h1> <xsl:for-each select="//*"> <xsl:call-template name="opisz-element"/> </xsl:for-each> </body></html> </xsl:template> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Listing 10: Przykład rekurencji 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <xsl:template name="silnia"> <xsl:param name="n"/> <xsl:param name="res" select="1"/> <xsl:choose> <xsl:when test="$n > 1"> <xsl:call-template name="silnia"> <xsl:with-param name="n" select="$n - 1"/> <xsl:with-param name="res" select="$n * $res"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$res"/> </xsl:otherwise> </xsl:choose> </xsl:template> Element <xsl:param parametr szablonu. name="obligatory name"select="optional expr"> deklaruje Element <xsl:with-param name="obligatory name"select="optional expr"> (wywołanie) definiuje wartość parametru przekazanego do szablonu. Atrybut name musi sie˛ zgadzać, z nazwa˛ elemenu <xsl:param>. Użycie jest dozwolone jedynie wewnatrz ˛ <xsl:apply-templates> i <xsl:call-template> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Defiowanie własnych funkcji 1 2 3 4 5 6 <xsl:function name="loc:silnia"> <xsl:param name="n"/> <xsl:sequence select="if($n <= 1) then 1 else $n * loc:silnia($n - 1)"/> </xsl:function> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Funkcje w XSLT XSLT zawiera około 100 funkcji: Przykłady funkcji current() Zwraca aktualny wez˛ ˛ eł document() Używane do odczytywania wezłów ˛ z innego dokumentu XML element-available() Sprawdza czy dany elemeny jest rozumiany przez procesor XSLT. Jeśłi nie można użyć elementu <xslt:fallback> format-number() Zamienia liczba˛ na ciag ˛ znaków function-available() Sprawdza czy funkcja jest dostepna ˛ generate-id() Zwraca unikalny ciag ˛ identyfikujacy ˛ dany wezeł ˛ system-property() Zwraca wartości systemowe <xsl:version>, <xsl:vendor>, <xsl:vendor-url> unparsed-entity-uri() Zwraca URI nieprzetworzonej encicji. T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Listing 11: Przykład srawdzania dostepno ˛ ści 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body> <xsl:choose> <xsl:when test="element-available(’xsl:comment’)"> <p>xsl:comment is supported.</p> </xsl:when> <xsl:otherwise> <p>xsl:comment is not supported.</p> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="element-available(’xsl:delete’)"> <p>xsl:delete is supported.</p> </xsl:when> <xsl:otherwise> <p>xsl:delete is not supported.</p> </xsl:otherwise> </xsl:choose> </body></html> </xsl:template> </xsl:stylesheet> T. Romańczukiewicz XML 04 XSLT Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne Zastosowania Prezentacja dokumentów Prezentacja bazy danych Konwersja miedzy ˛ dokumentami XML Raporty, podsumowania itp Tworzenie skryptów i plików konfiguracyjnych T. Romańczukiewicz XML 04 XSLT 1 2 3 Wstep ˛ Przykłady Instrukcje sterujace ˛ Elementy i atrrybuty Zmienne <Zyczenia> Wesolych Swiat < / Zyczenia> T. Romańczukiewicz XML 04