Język XSLT
Transkrypt
Język XSLT
Język XSLT © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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 © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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 © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz Struktura dokumentu XSLT Szablony oraz metody ich wywoływania Porządkowanie informacji wynikowych Transformacja warunkowa Modyfikacja dokumentu XML – dodawanie i usuwanie informacji © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 3 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 © UEK w Krakowie 5 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument XML Dokument XSLT Procesor XSLT Dokument wynikowy XML, HTML, TXT © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 6 3 Format XML Zawiera zbiór reguł transformacji dokumentu XML Reguły transformacji Dokument XSLT wzorce (XPath) szablony (fragmenty dokumentu wynikowego) © UEK w Krakowie 7 Janusz Stal & Grażyna Paliwoda-Pękosz <?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> Format dokumentu wynikowego <xsl:template match="…"> … </xsl:template> Reguły (szablony) transformacji <xsl:template match="…"> … </xsl:template> Wzorzec dopasowania </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 8 4 <apply-templates /> <apply-templates select=”wzorzec” /> Wyznaczenie zbioru węzłów Dopasowanie szablonu do każdego węzła ze zbioru © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz <?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> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 9 Powiązanie z plikiem transformacji 10 5 • Wywoływane, gdy w dokumencie transformacji nie został określony szablon jawny węzeł elementu, <xsl:template match="*|/"> <xsl:apply-templates /> </xsl:template> węzeł dokumentu <xsl:template match="@*|text()"> <xsl:value-of select="." /> </xsl:template> • Przykład: węzeł atrybutu, węzeł tekstowy pobranie zawartości Dokument transformacji XSLT <?xml version="1.0"?> <xsl:stylesheet version="1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform> </xsl:stylesheet> Efekt końcowy w przeglądarce chleb razowy 1.5 margaryna palma 1.99 cukier 0.7 margaryna 2.45 © UEK w Krakowie 11 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> Dokument wynikowy HTML <html> <body> chleb razowy<br/> margaryna palma<br/> cukier<br/> margaryna<br/> </body> </html> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz Efekt końcowy w przeglądarce chleb razowy margaryna palma cukier margaryna 12 6 Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> 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. <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie 13 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz Elementy szablonu, które nie naleŜą do przestrzeni nazw schematu (nie posiadają prefiksu xsl) zostają skierowane do dokumentu wynikowego w postaci niezmienionej. Dokument wynikowy HTML <html> <body> ... </body> </html> 14 7 Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Natomiast elementy szablonu, które naleŜą do przestrzeni nazw schematu (posiadają prefiks xsl) stanowią instrukcje transformacji i są wykonywane przez procesor. Dokument wynikowy HTML <html> <body> ... </body> </html> 15 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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. Dokument wynikowy HTML <html> <body> ... </body> </html> 16 8 Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Czy istnieje szablon pasujący do węzła sklep? Nie. Zatem zostanie wykonany szablon domyślny. <xsl:template match="*|/"> <xsl:apply-templates /> </xsl:template> Dokument wynikowy HTML <html> <body> ... </body> </html> 17 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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 /> </xsl:template> Dokument wynikowy HTML <html> <body> ... </body> </html> 18 9 Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie 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) Dokument wynikowy HTML <html> <body> ... </body> </html> 19 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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. Dokument wynikowy HTML <html> <body> ... </body> </html> 20 10 Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie 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. Dokument wynikowy HTML <html> <body> chleb razowy<br/> </body> </html> 21 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="towar"> <xsl:apply-templates select="nazwa"/> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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. Dokument wynikowy HTML <html> <body> chleb razowy<br/> cukier<br/> margaryna<br/> margaryna palma<br/> </body> </html> 22 11 Dokument transformacji XSLT Dokument wynikowy HTML <xsl:stylesheet> <html> <body> chleb razowy<br/> cukier<br/> margaryna<br/> margaryna palma<br/> </body> </html> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"> </xsl:apply-templates> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Efekt końcowy w przeglądarce chleb razowy cukier margaryna margaryna palma 23 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT Dokument wynikowy HTML <xsl:stylesheet> <html> <body> chleb razowy<br/> cukier<br/> margaryna<br/> margaryna palma<br/> </body> </html> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"> <xsl:sort order="ascending" data-type="text"/> </xsl:apply-templates> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz Efekt końcowy w przeglądarce chleb razowy cukier margaryna margaryna palma 24 12 Dokument transformacji XSLT Dokument wynikowy HTML <xsl:stylesheet> <html> <body> 1. chleb razowy<br/> 2. margaryna palma<br/> 3. cukier<br/> 4. margaryna<br/> </body> </html> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"/> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:number count="towar" format="1. "/> <xsl:value-of select="."/><br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Efekt końcowy w przeglądarce 1. 2. 3. 4. chleb razowy margaryna palma cukier margaryna 25 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT Dokument wynikowy HTML <xsl:stylesheet> <html> <body> chleb razowy<br/> margaryna palma<br/> margaryna<br/> </body> </html> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"/> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:if test="../cena/@waluta!='eur'"> <xsl:value-of select="."/><br/> </xsl:if> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz Efekt końcowy w przeglądarce chleb razowy margaryna palma margaryna 26 13 Dokument transformacji XSLT Dokument wynikowy HTML <xsl:stylesheet> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"/> </body> </html> </xsl:template> <xsl:template match="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/> </xsl:template> </xsl:stylesheet> <html> <body> chleb razowy<br/> margaryna palma<br/> <b>cukier</b><br/> margaryna<br/> </body> </html> © UEK w Krakowie Efekt końcowy w przeglądarce chleb razowy margaryna palma cukier margaryna 27 Janusz Stal & Grażyna Paliwoda-Pękosz Dokument transformacji XSLT Dokument wynikowy HTML <xsl:stylesheet> <html> <body> chleb razowy<br/> margaryna palma<br/> cukier<br/> margaryna<br/> </body> </html> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"/> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/> <xsl:call-template name="KoniecLinii"/> </xsl:template> <xsl:template name="KoniecLinii"> <br/> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz Efekt końcowy w przeglądarce chleb razowy margaryna palma cukier margaryna 28 14 Dokument transformacji XSLT Dokument wynikowy HTML <xsl:stylesheet> <html> <body> chleb razowy<br/> margaryna palma<br/> cukier<br/> margaryna<br/> </body> </html> <xsl:template match="/"> <html> <body> <xsl:for-each select="//nazwa"> <xsl:value-of select="."/> <br/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> Efekt końcowy w przeglądarce chleb razowy cukier margaryna margaryna palma © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 29 Przypisanie nazwy dla wzorca dopasowania <xsl:variable name="nazwaTowaru" select="//nazwa"/> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="$nazwaTowaru"> </xsl:apply-templates> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="."/><br/> </xsl:template> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 30 15 Dokument transformacji XSLT Dokument wynikowy HTML <xsl:variable name="liczbaTowarow"> <xsl:value-of select="count(//towar)"/> </xsl:variable> <html> <body> 1/4 cukier<br/> 2/4 chleb razowy<br/> 3/4 margaryna<br/> 4/4 margaryna palma<br/> </body> </html> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"> ="//nazwa"> <xsl:sort order="ascending" data-type="text"/> </xsl:apply-templates> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:value-of select="position()"/> <xsl:text>/</xsl:text> <xsl:value-of select="$liczbaTowarow"/> <xsl:text> </xsl:text> <xsl:value-of select="."/><br/> </xsl:template> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz Efekt końcowy w przeglądarce 1/4 2/4 3/4 4/4 cukier chleb razowy margaryna 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 wywołanie szablonu <xsl:template match="/"> z parametrem <html> WALUTA = ‘pln’ <body> <xsl:apply-templates select="//nazwa"> <xsl:with-param name="WALUTA" select="‘pln'"/> </xsl:apply-templates> </body> definicja parametru </html> wartość domyślna: </xsl:template> ‘eur’ <xsl:template match="nazwa"> <xsl:param name="WALUTA" select="'eur'"/> <xsl:value-of select="text()[../../cena/@waluta=$WALUTA]"/><br/> </xsl:template> chleb razowy margaryna margaryna palma © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 32 16 Wywołanie szablonu z wartością domyślną parametru <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//nazwa"> </xsl:apply-templates> </body> </html> </xsl:template> <xsl:template match="nazwa"> <xsl:param name="WALUTA" select="'eur'"/> <xsl:value-of select="text()[../../cena/@waluta=$WALUTA]"/><br/> </xsl:template> cukier © UEK w Krakowie 33 Janusz Stal & Grażyna Paliwoda-Pękosz Określanie separatora dziesiętnego Określanie liczby miejsc dziesiętnych <xsl:decimal-format/> <xsl:decimal-format decimal-separator="," /> format-number() <xsl:value-of select="format-number(., '#.00')"/> Przykład: <?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:template match="/"> <xsl:value-of select="format-number(26825.8, '#,###.00 zł', 'pln')"/> </xsl:template> </xsl:stylesheet> Oprac. na podstawie: http://www.w3schools.com/xsl/el_decimal-format.asp © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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 © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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:template match="/"> <xsl:copy-of select="*" /> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz <?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> </xsl:template> 37 Uzupełnianie struktury dokumentu XML o nowe informacje <xsl:template match="towar"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:attribute name="gatunek">1</xsl:attribute> <xsl:element name="producent">Polmark SA</xsl:element> <xsl:apply-templates/> </xsl:copy> </xsl:template> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 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> </xsl:template> Usunięcie informacji dotyczącej ceny z dokumentu XML <xsl:template match="cena"/> </xsl:stylesheet> © UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz 39 20