Plan Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 04 T. Romańczukiewicz Jagiellonian University 2009/2010
Plan Plan 1 XSLT
Plan 1 XSLT Wstęp Przykłady Instrukcje sterujace Elementy i atrrybuty Zmienne Funkcje Podsumowanie
XSL XPath XSLT (ang. XSL Transformations język 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 się będa 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 się robi dla HTML. Lepiej: XSL - arkusz stylów dla XML. Sam jest poprawnie zdefiniowanym dokumentem XML. XSLT - Język transformacji dokumentów XML XPath - Język do nawigacji w dokumentach XML XML-FO - (ang. Extensible Stylesheet Language Formatting Objects) język służacy do formatowania danych z dokumentu XML do prezentacji.
XSLT XSLT Jest najważniejsza częś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 Dzięki 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.
Przykład Listing 1: cdcatalog.xsl 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 3 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 4 5 <xsl:template match="/"> 6 <html> 7 <body> 8 <h2>my CD Collection</h2> 9 <table border="1"> 10 <tr bgcolor="#9acd32"> 11 <th>title</th> 12 <th>artist</th> 13 </tr> 14 <xsl:for-each select="catalog/cd"> 15 <tr> 16 <td><xsl:value-of select="title"/></td> 17 <td><xsl:value-of select="artist"/></td> 18 </tr> 19 </xsl:for-each> 20 </table> 21 </body> 22 </html> 23 </xsl:template> 24 25 </xsl:stylesheet> Zamiast znacznika <xsl:stylesheet> można używać <xsl:transform>.
Przykład Listing 2: cdcatalog.xml 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> 3 <catalog> 4 <cd> 5 <title>black Sabbath</title> 6 <artist>black Sabbath</artist> 7 <price>66.6</price> 8 <year>1970</year> 9 </cd> 10 11 <cd> 12 <title>strange Highways</title> 13 <artist>dio</artist> 14 <country>usa</country> 15 <year>1994</year> 16 </cd> 17 18 <cd> 19 <title>ghost of a Rose</title> 20 <artist>blackmores Night</artist> 21 <country>uk</country> 22 <year>2003</year> 23 </cd> 24 </catalog>
Element template Elementem głównym XSLT jest <xsl:stylesheet> lub <xsl:transform> W arkuszu XSLT znajduje się co najmniej jeden element <template>. Posiada on atrybut match, którego wartość jest wyrażeniem XPath. Element ten wybiera kontekst (węzeł) 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 będa prezentowane. Wewnatrz elemetów HTML można się odwoływać do pliku XML poprzez element: <xsl:value-of select="catalog/cd/title"/>
Przykład Listing 3: cdcatalog.xsl 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 3 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 4 5 <xsl:template match="/"> 6 <html> 7 <body> 8 <h2>my CD Collection</h2> 9 <table border="1"> 10 <tr bgcolor="#9acd32"> 11 <th>title</th> 12 <th>artist</th> 13 </tr> 14 <tr> 15 <td><xsl:value-of select="title"/></td> 16 <td><xsl:value-of select="artist"/></td> 17 </tr> 18 </table> 19 </body> 20 </html> 21 </xsl:template> 22 </xsl:stylesheet> Wypisze tylko pierwsza pozycję z katalogu.
Element for-each i inne instrukcje sterujace Listing 4: cdcatalog.xsl 1... 2 <xsl:for-each select="katalog/cd"> 3 <tr> 4 <td><xsl:vale-of select="tatle"/></td> 5 <td><xsl:vale-of select="artist"/></td> 6 </tr> 7 </xsl:for-each> 8... Atrybut select jest wyrażeniem XPath. Mże zawierać również dodaktowe filtry: <xsl:for-each select="catalog/cd[artist= Dio ]"> Dozwolone filtry to = równe!= nierówne < mniejsze > większe Inne instruckje sterujace: <xsl:if test="price > 6"> Uwaga: brak else <xsl:sort select="artist"/> Można użyć w for-each, for-each-group, apply-templates
Instrukcja choose Listing 5: Instrukcja choose 1 <xsl:choose> 2 <xsl:when test="expression"> 3... some output... 4 </xsl:when> 5 <xsl:otherwise> 6... some output... 7 </xsl:otherwise> 8 </xsl:choose> 9 10 <xsl:for-each select="catalog/cd"> 11 <tr> 12 <td><xsl:value-of select="title"/></td> 13 <xsl:choose> 14 <xsl:when test="price > 10"> 15 <td bgcolor="#ff00ff"> 16 <xsl:value-of select="artist"/></td> 17 </xsl:when> 18 <xsl:otherwise> 19 <td><xsl:value-of select="artist"/></td> 20 </xsl:otherwise> 21 </xsl:choose> 22 </tr> 23 </xsl:for-each>
perform-sort Listing 6: Sortowanie 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 4 5 <xsl:template match="/"> 6 <html> 7 <body> 8 <h2>my CD Collection</h2> 9 <table border="1"> 10 <tr bgcolor="#9acd32"> 11 <th>title</th> 12 <th>artist</th> 13 </tr> 14 <xsl:for-each select="catalog/cd"> 15 <xsl:sort select="artist"/> 16 <tr> 17 <td><xsl:value-of select="title"/></td> 18 <td><xsl:value-of select="artist"/></td> 19 </tr> 20 </xsl:for-each> 21 </table> 22 </body> 23 </html> 24 </xsl:template> 25 26 </xsl:stylesheet>
applay-templates 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 4 5 <xsl:template match="/"> 6 <html> 7 <body> 8 <h2>my CD Collection</h2> 9 <xsl:apply-templates/> 10 </body> 11 </html> 12 </xsl:template> 13 14 <xsl:template match="cd"> 15 <p> 16 <xsl:apply-templates select="title"/> 17 <xsl:apply-templates select="artist"/> 18 </p> 19 </xsl:template> 20 21 <xsl:template match="title"> 22 Title: <span style="color:#ff0000"> 23 <xsl:value-of select="."/></span> 24 <br /> 25 </xsl:template> 26 27 <xsl:template match="artist"> 28 Artist: <span style="color:#00ff00"> 29 <xsl:value-of select="."/></span> 30 <br /> 31 </xsl:template> 32 33 </xsl:stylesheet>
Wynikowe drzewo XSLT przekształca jeden dokument XML w drugi. W wynikowym drzewie można tworzyć na kilka sposobów: Węzły moga być wpisane w arkusz XSLT Można je tworzyć przy pomocy konstruktorów <xsar:element>, <xsar:comment> Moga być przepisane z pliku źródłowego Listing 7: Elementy w arkuszu 1 <xsl:for-each select="catalog/cd"> 2 <tr> 3 <td><xsl:value-of select="title"/></td> 4 <td><xsl:value-of select="artist"/></td> 5 </tr> 6 </xsl:for-each>
xsl:element Listing 8: Elementy w arkuszu cd. 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 4 5 <xsl:template match="/"> 6 <xsl:for-each select="catalog/cd"> 7 <xsl:element name="singer"> 8 <xsl:value-of select="artist" /> 9 </xsl:element> 10 <br /> 11 </xsl:for-each> 12 </xsl:template> 13 14 </xsl:stylesheet>
xsl:attribute 1 <picture> 2 <xsl:attribute name="source"/> 3 </picture> 4 5 <picture> 6 <xsl:attribute name="source"> 7 <xsl:value-of select="images/name" /> 8 </xsl:attribute> 9 </picture> 10 11 <xsl:attribute-set name="font"> 12 <xsl:attribute name="fname">arial</xsl:attribute> 13 <xsl:attribute name="size">14px</xsl:attribute> 14 <xsl:attribute name="color">red</xsl:attribute> 15 </xsl:attribute-set>
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.
Listing 9: Przykłady zastosowań. 1 <! i n s t r u k c j a p r z e t w a z a n i a > 2 <xsl:processing-instruction target="xml-stylesheet"> 3 type="text/css" href="styl.css" 4 </xsl:processing-instruction> 5 6 <! Dynamicznie nadawana nazwa elementu > 7 <xsl:element name="h{max((count(ancestor-or-self::sekcja), 6))}"> 8... 9 </xsl:element> 10 11 <! Warunkowe w s t a w i a n i e a t r y b u t u > 12 <p> 13 <xsl:if test="@stanowisko = kierownik"> 14 <xsl:attribute name="class"> 15 szef 16 </xsl:attribute> 17 </xsl:if> 18 </p>
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ęści stałe napisy kopiowane do wyniku Wyrażenia XPATH umieszczone między { i } Reprezentacja tekstowa wyliczanej sekwencji
element output Element <xsl:output> definiuje format danych wynikowych. Musi się pojawić jako dziecko <xsl:stylesheet> lub <xsl:transform> method xml html text name version encoding omit-xml-declaration string string yes no standalone indent yes no yes no
Zmienne Zmienne w XSLT sa elementami postaci: 1 <xsl:variable name="name" select="expression"> 2 <! Content: template > 3 </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 się poprzez zawartość elementu lub poprzez atrybut select Uwaga: Gdy raz określi się wartość zmiennej, nie można jej już modyfikować.
Zmienne 1 <xsl:variable name="header"> 2 <tr> 3 <th>element</th> 4 <th>description</th> 5 </tr> 6 </xsl:variable> 7 8 <xsl:template match="/"> 9 <table> 10 <xsl:copy-of select="$header" /> 11 <xsl:for-each select="reference/record"> 12 <tr> 13 <xsl:if category="xml"> 14 <td><xsl:value-of select="element"/></td> 15 <td><xsl:value-of select="description"/></td> 16 </xsl:if> 17 </tr> 18 </xsl:for-each> 19 </table> 20 <br /> 21 <table> 22 <xsl:copy-of select="$header" /> 23 <xsl:for-each select="table/record"> 24 <tr> 25 <xsl:if category="xsl"> 26 <td><xsl:value-of select="element"/></td> 27 <td><xsl:value-of select="description"/></td> 28 </xsl:if> 29 </tr> 30 </xsl:for-each> 31 </table>
copy i copy-of 1 <xsl:copy use-attribute-sets="name-list"> 2 <! Content: template > 3 </xsl:copy> 4 5 <xsl:copy-of use-attribute-sets="name-list"> 6 <! Content: template > 7 </xsl:copy-of> Element <xsar:copy> tworzy kopię aktualnego węzła, ale bez dzieci i atrybutów. Przestrzeń nazw jest automatycznie kopiowana! Element <xsar:copy-of> tworzy kopię aktualnego węzła wraz z dziećmi i atrybutami
Szablony nazwane W szablonie atrybut name. call-template uruchamia. Bez zmiany węzła bieżacego (inaczej niż apply-templates). Możliwa rekurencja 1 <xsl:template name="opisz-element"> 2 <p>element o nazwie <xsl:value-of select="name()"/>.</p> 3 </xsl:template> 4 5 <xsl:template match="/"> 6 <html><body> 7 <h1>wszystkie elementy:</h1> 8 <xsl:for-each select="//*"> 9 <xsl:call-template name="opisz-element"/> 10 </xsl:for-each> 11 </body></html> 12 </xsl:template>
Listing 10: Przykład rekurencji 1 <xsl:template name="silnia"> 2 <xsl:param name="n"/> 3 <xsl:param name="res" select="1"/> 4 <xsl:choose> 5 <xsl:when test="$n > 1"> 6 <xsl:call-template name="silnia"> 7 <xsl:with-param name="n" select="$n - 1"/> 8 <xsl:with-param name="res" 9 select="$n * $res"/> 10 </xsl:call-template> 11 </xsl:when> 12 <xsl:otherwise> 13 <xsl:value-of select="$res"/> 14 </xsl:otherwise> 15 </xsl:choose> 16 </xsl:template> Element <xsl:param name="obligatory name"select="optional expr"> deklaruje parametr szablonu. Element <xsl:with-param name="obligatory name"select="optional expr"> (wywołanie) definiuje wartość parametru przekazanego do szablonu. Atrybut name musi się zgadzać, z nazwa elemenu <xsl:param>. Użycie jest dozwolone jedynie wewnatrz <xsl:apply-templates> i <xsl:call-template>
Defiowanie własnych funkcji 1 <xsl:function name="loc:silnia"> 2 <xsl:param name="n"/> 3 <xsl:sequence select="if($n <= 1) 4 then 1 5 else $n * loc:silnia($n - 1)"/> 6 </xsl:function>
Funkcje w XSLT XSLT zawiera około 100 funkcji: Przykłady funkcji current() document() Zwraca aktualny węzęł Używane do odczytywania węzłów z innego dokumentu XML element-available() format-number() function-available() generate-id() system-property() unparsed-entity-uri() Sprawdza czy dany elemeny jest rozumiany przez procesor XSLT. Jeśłi nie można użyć elementu <xslt:fallback> Zamienia liczba na ciag znaków Sprawdza czy funkcja jest dostępna Zwraca unikalny ciag identyfikujacy dany węzeł Zwraca wartości systemowe <xsl:version>, <xsl:vendor>, <xsl:vendor-url> Zwraca URI nieprzetworzonej encicji.
Listing 11: Przykład srawdzania dostępności 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 4 5 <xsl:template match="/"> 6 <html><body> 7 <xsl:choose> 8 <xsl:when test="element-available( xsl:comment )"> 9 <p>xsl:comment is supported.</p> 10 </xsl:when> 11 <xsl:otherwise> 12 <p>xsl:comment is not supported.</p> 13 </xsl:otherwise> 14 </xsl:choose> 15 <xsl:choose> 16 <xsl:when test="element-available( xsl:delete )"> 17 <p>xsl:delete is supported.</p> 18 </xsl:when> 19 <xsl:otherwise> 20 <p>xsl:delete is not supported.</p> 21 </xsl:otherwise> 22 </xsl:choose> 23 </body></html> 24 </xsl:template> 25 26 </xsl:stylesheet>
Zastosowania Prezentacja dokumentów Prezentacja bazy danych Konwersja między dokumentami XML Raporty, podsumowania itp Tworzenie skryptów i plików konfiguracyjnych
1 <Zyczenia> 2 Wesolych Swiat 3 < / Zyczenia>