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 &lt; $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 &lt; $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 &lt; $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 &lt; $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>

Podobne dokumenty