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 arkusz XSLT procesor 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: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: <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 name="test"> abc <galeria> <obrazek plik="most.jpg"/> <obrazek plik="widok.jpg"/> </galeria>
<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 name="test"> abc?
<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... 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 <body> <h3>obrazki</h3> <galeria> <obrazek plik="most.jpg"/> <obrazek plik="widok.jpg"/> </galeria> <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: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> 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> </osoba> W przeglądarce: </xsl:variable> <xsl:template match="/"> <html><body> <h3>spis</h3> <xsl:copy-of select="$osoba"/> </body></html>
<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: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: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> 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> Przykład (cd) <liczby start="1" stop="10"/> 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:variable> Przykład (cd) <liczby start="1" stop="10"/> Arkusz XSL (cd): <xsl:template match="/"> <html> <body> <h3>wypisujemy liczby</h3> <xsl:call-template name="liczby"/> </body> </html> 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: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: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>