xsl:template
Transkrypt
xsl:template
XML – eXtensible Markup Language część 8 XSL transformations (XSLT) XSLT (ang. eXtensible Stylesheet Language Transformations) jest opartym na XML językiem transformacji dokumentów XML XSLT umożliwia „przetłumaczenie” dokumentów z jednego formatu XML na inny format XML, ale również na HTML, PDF i inne. Arkusze XSLT określają w jaki sposób przekształcić poszczególne elementy wejściowe pliku XML. dokument XML procesor XSLT arkusz XSLT plik wyjściowy (XML, HTML, PDF etc.) <xsl:attribute> Do elementu HTML możemy dodać atrybut będący zawartością jakiegoś elementu bądź wartością atrybutu z dokumentu XML. Przykład <galeria> <obrazek>most.jpg</obrazek> <obrazek>widok.jpg</obrazek> </galeria> <body> <h3>Obrazki</h3> <xsl:for-each select="galeria/obrazek"> <img> <xsl:attribute name="src"> <xsl:value-of select="."/> </xsl:attribute> </img> </xsl:for-each> </body> <xsl:attribute> Przykład Inaczej: <galeria> <obrazek plik="most.jpg"/> <obrazek plik="widok.jpg"/> </galeria> <body> <h3>Obrazki</h3> <xsl:for-each select="galeria/obrazek"> <img> <xsl:attribute name="src"> <xsl:value-of select="@plik"/> </xsl:attribute> </img> </xsl:for-each> </body> Element nie istnieje? Przykład <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="application/xml" href="arkusz.xsl"?> <spis_osob> <osoba> <imie>Marek</imie> <nazwisko>Nowak</nazwisko> <wiek>23</wiek> </osoba> <osoba> <imie>Tomasz</imie> <nazwisko>Pawlak</nazwisko> <wiek>33</wiek> </osoba> <osoba> <imie>Piotr</imie> <nazwisko>Kaczkowski</nazwisko> </osoba> </spis_osob> Element nie istnieje? Przykład (cd) <table border="1"> <tr> <th>First name</th><th>Last name</th><th>Age</th> </tr> <xsl:for-each select="spis_osob/osoba"> <tr> <td><xsl:value-of select="imie"/></td> <td><xsl:value-of select="nazwisko"/></td> <xsl:choose> <xsl:when test="wiek"> <td><xsl:value-of select="wiek"/></td> </xsl:when> <xsl:otherwise> <td style="background-color:red"> <xsl:text>brak danych</xsl:text> </td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> </table> <xsl:template> Odwołanie do elementów o określonej nazwie. Przykład <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="osoba"> abc </xsl:template> </xsl:stylesheet> W przeglądarce: <xsl:call-template> Instrukcja ta pozwala nam wywołać szablon o określonej nazwie. Składnia: <xsl:call-template name="templatename"> <!-- Content:xsl:with-param* --> </xsl:call-template> <xsl:attribute> Przykład (cd) Arkusz XSL: Dokument XML: <galeria> <obrazek plik="most.jpg"/> <obrazek plik="widok.jpg"/> </galeria> <xsl:template match="/"> <html> <body> <h3>Obrazki</h3> <xsl:for-each select="galeria/obrazek"> <xsl:call-template name="test"/> </xsl:for-each> </body> </html> </xsl:template> <xsl:template name="test"> abc </xsl:template> <xsl:attribute> Przykład (cd) Czy można do szablonu przekazać zawartość elementu ew. wartość atrybutu? <xsl:template match="/"> <html> <body> <h3>Obrazki</h3> <xsl:for-each select="galeria/obrazek"> <xsl:call-template name="test"/> </xsl:for-each> </body> </html> </xsl:template> <xsl:template name="test"> abc </xsl:template> ? <xsl:param> Deklaracja lokalnego bądź globalnego parametru. Parametr jest lokalny jeżeli jest zadeklarowany w elemencie template. Składnia: <xsl:param name="name" select="expression"> <!-- Content:template --> </xsl:param> Atrybuty: • name – określa nazwę parametru (wymagany) • select – wartość w postaci wyrażenia XPath (opcjonalny) <xsl:with-param> Definiujemy wartość parametru, który ma być przekazany do szablonu. Składnia: <xsl:with-param name="name" select="expression"> <!-- Content:template --> </xsl:with-param> Atrybuty: • name – określa nazwę parametru (wymagany) • select – wartość w postaci wyrażenia XPath (opcjonalny) <xsl:param> + <xsl:with-param> Jeżeli szablon wymaga parametru: <xsl:template name="tname"> <xsl:param name="pname"/> ... $pname ... </xsl:template> …to musimy do „przesłać” do szablonu przy wywołaniu: <xsl:call-template name="tname"> <xsl:with-param name="pname" select="expression"/> </xsl:call-template> <xsl:param> + <xsl:with-param> Przykład <galeria> <obrazek plik="most.jpg"/> <obrazek plik="widok.jpg"/> </galeria> <body> <h3>Obrazki</h3> <xsl:for-each select="galeria/obrazek"> <xsl:call-template name="test"> <xsl:with-param name="plik" select="." /> </xsl:call-template> </xsl:for-each> </body> <xsl:template name="test"> <xsl:param name="plik"/> <img> <xsl:attribute name="src"> <xsl:value-of select="$plik"/> </xsl:attribute> </img> </xsl:template> <xsl:variable> Deklaracja lokalnej bądź globalnej zmiennej. Zmienna jest loklana jeżeli jest zadeklarowana w elemencie template. Składnia: <xsl:variable name="name" select="expression"> <!-- Content:template --> </xsl:variable> UWAGA: raz ustalona zmienna nie powinna zmieniać wartości!!! <xsl:variable> Nadanie wartości zmiennej przez atrybut. Przykład <xsl:variable name="osoba" select="'Przemek'"/> <xsl:template match="/"> <html><body> <h3>Spis</h3> <xsl:copy-of select="$osoba" /> </body></html> </xsl:template> W przeglądarce: <xsl:variable> Nadanie wartości zmiennej przez zawartość elementu. Przykład <xsl:variable name="osoba"> <osoba> <imie>Przemek</imie> <nazwisko>Kowal</nazwisko> <wiek>42</wiek> W przeglądarce: </osoba> </xsl:variable> <xsl:template match="/"> <html><body> <h3>Spis</h3> <xsl:copy-of select="$osoba"/> </body></html> </xsl:template> <xsl:variable> A co jeżeli zmienimy wartość zmiennej? Przykład <xsl:variable name="osoba" select="'Przemek'"/> <xsl:template match="/"> <html><body> <h3>Spis</h3> <xsl:copy-of select="$osoba" /> </body> </html> </xsl:template> <xsl:variable name="osoba" select="'Agata'"/> W przeglądarce: <xsl:variable> Nadanie wartości zmiennej przez wyrażenie XPath. Przykład Dokument XML: <liczby start="1" stop="31"/> Arkusz XSL: <xsl:variable name="a" select="/liczby/@start"/> <xsl:variable name="b" select="/liczby/@stop"/> <xsl:template match="/"> <html> <body> <p>a=<xsl:value-of select="$a"/></p> <p>b=<xsl:value-of select="$b"/></p> </body> </html> </xsl:template> <xsl:variable> Przykład <xsl:variable name="start" select="/tabela/@start"/> <xsl:variable name="stop" select="/tabela/@stop"/> <xsl:variable name="zm1" select="$start + $stop"/> <xsl:variable name="zm2" select="$start + $stop + 10"/> <xsl:template match="/"> <html> <body> <p>zmienna 1 = <xsl:value-of select="$zm1"/></p> <p>zmienna 2 = <xsl:value-of select="$zm2"/></p> </body> </html> </xsl:template> W przeglądarce: <xsl:variable> Rozważmy teraz następujący program: Przykład int start=1; int stop=10; int main() { for(int i=start;i<=stop;i++) { cout<<i; } return 0; } <xsl:variable> Rozważmy teraz następujący program: Przykład int start=1; int stop=10; void wypisz(int i) { if(i<stop+1) { cout<<i; wypisz(++i); } } int main() { wypisz(start); return 0; } <xsl:variable> Nadanie wartości zmiennej przez wyrażenie XPath. Przykład Dokument XML: <?xml version="1.0"?> <?xml-stylesheet type="application/xml" href="arkusz.xsl"?> <liczby start="1" stop="10"/> Arkusz XSL: <xsl:variable name="start" select="/liczby/@start"/> <xsl:variable name="stop" select="/liczby/@stop"/> <xsl:variable> <liczby start="1" stop="10"/> Przykład (cd) Arkusz XSL (cd): <xsl:template name="liczby"> <xsl:param name="index" select="$start"/> <xsl:if test="$index < $stop+1"> <span><xsl:value-of select="$index"/></span> <xsl:call-template name="liczby"> <xsl:with-param name="index" select="$index+1"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:variable> <liczby start="1" stop="10"/> Przykład (cd) Arkusz XSL (cd): <xsl:template match="/"> <html> <body> <h3>Wypisujemy liczby</h3> <xsl:call-template name="liczby"/> </body> </html> </xsl:template> W przeglądarce: <xsl:text> Element umożliwiający dodanie tekstu do pliku wynikowego. Przykład (już omawiany ale zmodyfikowany!) <xsl:template name="liczby"> <xsl:param name="index" select="$start"/> <xsl:if test="$index < $stop+1"> <span><xsl:value-of select="$index"/></span> <xsl:text>,</xsl:text> <xsl:call-template name="liczby"> <xsl:with-param name="index" select="$index+1"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:text> Przykład (już omawiany ale zmodyfikowany!) <xsl:template name="liczby"> <xsl:param name="index" select="$start"/> <xsl:if test="$index < $stop+1"> <span><xsl:value-of select="$index"/></span> <xsl:if test="$index!=$stop"> <xsl:text>,</xsl:text> </xsl:if> <xsl:call-template name="liczby"> <xsl:with-param name="index" select="$index+1"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:text> Przykład (już omawiany ale zmodyfikowany!) <xsl:template name="liczby"> <xsl:param name="index" select="$start"/> <xsl:if test="$index < $stop+1"> <span><xsl:value-of select="$index"/></span> <xsl:if test="$index=$stop"> <xsl:text>,</xsl:text> </xsl:if> <xsl:call-template name="liczby"> <xsl:with-param name="index" select="$index+1"/> </xsl:call-template> </xsl:if> </xsl:template>