Język XSLT Po zrealizowaniu materiału student będzie w stanie Dokonać przekształcenia zawartości dokumentu XML do formatu HTML oraz TXT Realizować przetwarzanie warunkowe dokumentu XML Formatować wartości wynikowe Dokonywać selekcji oraz porządkowania rezultatów transformacji 2 1
W3C http://www.w3.org/standards/xml/transformation ZVON XSLT tutorial http://www.zvon.org/comp/r/tut-xslt_1.html# w języku polskim: http://zvon.org/xxl/xsltutorial/output_pol/contents.html W3Schools XSLT tutorial http://www.w3schools.com/xsl/default.asp AltovaXML procesor XML (walidacja oraz transformacja dokumentu XML) http://www.altova.com/download_components.html Dowolna przeglądarka internetowa 3 Struktura dokumentu XSLT Szablony oraz metody ich wywoływania Porządkowanie informacji wynikowych Transformacja warunkowa Modyfikacja dokumentu XML dodawanie i usuwanie informacji 4 2
XSLT extensible Stylesheet Language Transformation XSL = XSLT + XSL-FO+ XPATH przestrzeń nazw http://www.w3.org/1999/xsl/transform Zastosowanie przekształcanie dokumentu źródłowego XML wizualizacja danych 5 Dokument XML Dokument XSLT Procesor XSLT Dokument wynikowy XML, HTML, TXT 6 3
Dokument XSLT Format XML Zawiera zbiór reguł transformacji dokumentu XML Reguły transformacji wzorce (XPath) szablony (fragmenty dokumentu wynikowego) 7 <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="html"... /> <xsl:template match=" "> <xsl:template match=" "> <xsl:template match=" "> Format dokumentu wynikowego Reguły (szablony) transformacji Wzorzec dopasowania 8 4
<apply-templates/> <apply-templates select= wzorzec /> Wyznaczenie zbioru węzłów Dopasowanie szablonu do każdego węzła ze zbioru 9 <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="sklep.xsl"?> <sklep> <towar kod="2213" ilosc="150" jm="szt"> <nazwa>chleb razowy</nazwa> <cena waluta="pln">1.5</cena> </towar> <towar kod="2115" ilosc="21" jm="szt"> <nazwa>margaryna palma</nazwa> <cena waluta="pln">1.99</cena> </towar> <towar kod="2010" ilosc="92" jm="kg"> <nazwa>cukier</nazwa> <cena waluta="eur">0.7</cena> </towar> <towar kod="2520" ilosc="73" jm="szt"> <nazwa>margaryna</nazwa> <cena waluta="pln">2.45</cena> </towar> </sklep> Powiązanie z plikiem transformacji 10 5
Wywoływane, gdy w dokumencie transformacji nie został określony szablon jawny węzeł elementu, węzeł dokumentu <xsl:template match="* /"> <xsl:apply-templates /> <xsl:template match="@* text()"> <xsl:value-of select="." /> Przykład: Dokument transformacji XSLT <?xml version="1.0"?> <xsl:stylesheet version="1.0 xmlns:xsl=http://www.w3.org/1999/xsl/transform> Efekt końcowy w przeglądarce węzeł atrybutu, węzeł tekstowy pobranie zawartości chleb razowy 1.5 margaryna palma 1.99 cukier 0.7 margaryna 2.45 11 Dokument transformacji XSLT chleb razowy<br/> margaryna palma<br/> cukier<br/> margaryna<br/> Efekt końcowy w przeglądarce chleb razowy margaryna palma cukier margaryna 12 6
Dokument transformacji XSLT KaŜda transformacja rozpoczyna się zawsze od wykonania zawartości szablonu dla węzła głównego (/). Czy istnieje szablon pasujący do węzła głównego? Tak. Zatem jego zawartość zostanie wykonana. 13 Dokument transformacji XSLT Elementy szablonu, które nie naleŝą do przestrzeni nazw schematu (nie posiadają prefiksu xsl) zostają skierowane do dokumentu wynikowego w postaci niezmienionej.... 14 7
Dokument transformacji XSLT Natomiast elementy szablonu, które naleŝą do przestrzeni nazw schematu (posiadają prefiks xsl) stanowią instrukcje transformacji i są wykonywane przez procesor.... 15 Dokument transformacji XSLT Instrukcja apply-templates: 1. Wyznacza wszystkie węzły dzieci (child) dla węzła kontekstowego (w tym wypadku węzłem kontekstowym jest /, a węzły dzieci to sklep) 2. Dla kaŝdego wyznaczonego węzła odszukuje i wykonuje szablon.... 16 8
Dokument transformacji XSLT Czy istnieje szablon pasujący do węzła sklep? Nie. Zatem zostanie wykonany szablon domyślny. <xsl:template match="* /"> <xsl:apply-templates />... 17 Dokument transformacji XSLT Zawartością szablonu domyślnego jest instrukcja apply-templates, która wyznaczy węzły dzieci dla węzła kontekstowego (sklep) i dopasuje dla nich szablony. /> <xsl:template match="* /"> <xsl:apply-templates />... 18 9
Dokument transformacji XSLT Dla węzła sklep istnieją 4 węzły dzieci o nazwach towar. Czy istnieje szablon pasujący do węzła towar? Tak. Zatem jego zawartość zostanie wykonana (czterokrotnie, dla kaŝdego węzła towar)... 19 Dokument transformacji XSLT Wykonanie szablonu dla pierwszego węzła towar spowoduje wykonanie instrukcji apply-templates zawartej w tym szablonie. Instrukcja ta nie wskazuje na wszystkie dzieci węzła kontekstowego (towar), ale na węzły dzieci o konkretnej nazwie (nazwa). Tylko dla takich węzłów zostanie dopasowany szablon.... 20 10
Dokument transformacji XSLT Szablon zawiera instrukcję value-of zwracającą wartość węzła. Wartość ta jest skierowana do pliku wynikowego. Zwróć uwagę na element <br/>. PoniewaŜ nie posiada on prefiksu xsl, zostanie on równieŝ skierowany do dokumentu wynikowego. chleb razowy<br/> 21 Dokument transformacji XSLT Wykonanie szablonu dla pozostałych trzech węzłów towar przebiega identycznie, jak zostało to opisane. Rezultatem są kolejne trzy linie w pliku wynikowym. chleb razowy<br/> cukier<br/> margaryna<br/> margaryna palma<br/> 22 11
Dokument transformacji XSLT <xsl:apply-templates select="//nazwa"> </xsl:apply-templates> chleb razowy<br/> cukier<br/> margaryna<br/> margaryna palma<br/> Efekt końcowy w przeglądarce chleb razowy cukier margaryna margaryna palma 23 Dokument transformacji XSLT <xsl:apply-templates select="//nazwa"> <xsl:sort order="ascending" data-type="text"/> </xsl:apply-templates> chleb razowy<br/> cukier<br/> margaryna<br/> margaryna palma<br/> Efekt końcowy w przeglądarce chleb razowy cukier margaryna margaryna palma 24 12
Dokument transformacji XSLT <xsl:apply-templates select="//nazwa"/> <xsl:number count="towar" format="1. "/> 1. chleb razowy<br/> 2. margaryna palma<br/> 3. cukier<br/> 4. margaryna<br/> Efekt końcowy w przeglądarce 1. chleb razowy 2. margaryna palma 3. cukier 4. margaryna 25 Dokument transformacji XSLT <xsl:apply-templates select="//nazwa"/> <xsl:if test="../cena/@waluta!='eur'"> </xsl:if> chleb razowy<br/> margaryna palma<br/> margaryna<br/> Efekt końcowy w przeglądarce chleb razowy margaryna palma margaryna 26 13
Dokument transformacji XSLT <xsl:apply-templates select="//nazwa"/> <xsl:choose> <xsl:when test="../cena/@waluta='eur'"> <b><xsl:value-of select="."/></b> </xsl:when> <xsl:otherwise> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> <br/> chleb razowy<br/> margaryna palma<br/> <b>cukier</b><br/> margaryna<br/> Efekt końcowy w przeglądarce chleb razowy margaryna palma cukier margaryna 27 Dokument transformacji XSLT <xsl:apply-templates select="//nazwa"/> <xsl:value-of select="."/> <xsl:call-template name="konieclinii"/> <xsl:template name="konieclinii"> <br/> chleb razowy<br/> margaryna palma<br/> cukier<br/> margaryna<br/> Efekt końcowy w przeglądarce chleb razowy margaryna palma cukier margaryna 28 14
Dokument transformacji XSLT <xsl:for-each select="//nazwa"> <xsl:value-of select="."/> <br/> </xsl:for-each> chleb razowy<br/> margaryna palma<br/> cukier<br/> margaryna<br/> Efekt końcowy w przeglądarce chleb razowy cukier margaryna margaryna palma 29 Przypisanie nazwy dla wzorca dopasowania <xsl:variable name="nazwatowaru" select="//nazwa"/> <xsl:apply-templates select="$nazwatowaru"> </xsl:apply-templates> 30 15
Dokument transformacji XSLT <xsl:variable name="liczbatowarow"> <xsl:value-of select="count(//towar)"/> </xsl:variable> <xsl:apply-templates select="//nazwa"> <xsl:sort order="ascending" data-type="text"/> </xsl:apply-templates> <xsl:value-of select="position()"/> <xsl:text>/</xsl:text> <xsl:value-of select="$liczbatowarow"/> <xsl:text> </xsl:text> 1/4 cukier<br/> 2/4 chleb razowy<br/> 3/4 margaryna<br/> 4/4 margaryna palma<br/> Efekt końcowy w przeglądarce 1/4 cukier 2/4 chleb razowy 3/4 margaryna 4/4 margaryna palma Źródło: opracowanie na podstawie http://zvon.org/xxl/xsltutorial/output_pol/ example33_ch9.html 31 Wywołanie szablonu dla zmiennych wartości <xsl:apply-templates select="//nazwa"> <xsl:with-param name="waluta" select=" pln'"/> </xsl:apply-templates> wywołanie szablonu z parametrem WALUTA = pln definicja parametru wartość domyślna: eur <xsl:param name="waluta" select="'eur'"/> <xsl:value-of select="text()[../../cena/@waluta=$waluta]"/><br/> chleb razowy margaryna margaryna palma 32 16
Wywołanie szablonu z wartością domyślną parametru <xsl:apply-templates select="//nazwa"> </xsl:apply-templates> <xsl:param name="waluta" select="'eur'"/> <xsl:value-of select="text()[../../cena/@waluta=$waluta]"/><br/> cukier 33 Określanie separatora dziesiętnego <xsl:decimal-format/> Określanie liczby miejsc dziesiętnych format-number() Przykład: <xsl:decimal-format decimal-separator="," /> <xsl:value-of select="format-number(., '#.00')"/> <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:decimal-format name="pln" decimal-separator="." grouping-separator=","/> <xsl:value-of select="format-number(26825.8, '#,###.00 zł', 'pln')"/> Oprac. na podstawie: http://www.w3schools.com/xsl/el_decimal-format.asp 26,825.80 zł 34 17
Tworzenie struktury <xsl:element> <xsl:attribute> <xsl:comment> <xsl:processing-instruction> <xsl:attribute-set> Kopiowanie struktury <xsl:copy> <xsl:copy-of> Usuwanie elementów i/lub atrybutów Zastosowanie szablonu pustego 35 Kopiowanie struktury dokumentu z wykorzystaniem elementu COPY-OF <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes" /> <xsl:copy-of select="*" /> 36 18
Kopiowanie struktury dokumentu z wykorzystaniem elementu COPY <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes" /> <xsl:template match="@* node()"> <xsl:copy> <xsl:apply-templates select="@* node()"/> </xsl:copy> 37 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes" /> <xsl:template match="@* node()"> <xsl:copy> <xsl:apply-templates select="@* node()"/> </xsl:copy> Uzupełnianie struktury dokumentu XML o nowe informacje <xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="gatunek">1</xsl:attribute> <xsl:element name="producent">polmark SA</xsl:element> </xsl:copy> 38 19
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes" /> <xsl:template match="@* node()"> <xsl:copy> <xsl:apply-templates select="@* node()"/> </xsl:copy> Usunięcie informacji dotyczącej ceny z dokumentu XML <xsl:template match="cena"/> 39 20