XSLT - Instytut Podstaw Informatyki PAN

Download Report

Transcript XSLT - Instytut Podstaw Informatyki PAN

XSLT
Jakub Wojciechowski
Jakub Wojciechowski PJWSTK 2002
Plan prezentacji
• XPath
– Podstawy
• XSLT
– Ogólna budowa
– Zastosowanie XPath w szablonach
– Elementy
Jakub Wojciechowski PJWSTK 2002
Xpath - wprowadzenie
• Służy do znajdywania elementów
dokumentu XML spełniających określony
warunek
• Składnia zbliżona do nazw w systemie
plików (przykład: /samochody/fiat/ )
Jakub Wojciechowski PJWSTK 2002
XPath cz. 1
XML:
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Wyrażenie XPath:
/AAA/BBB
ścieżka bezwzględna
Jakub Wojciechowski PJWSTK 2002
XPath cz. 2
XML:
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Wyrażenie XPath:
//BBB
Wszystkie wystąpienia
wzorca w dokumencie
XML
Jakub Wojciechowski PJWSTK 2002
XPath cz. 3
XML:
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
<CCC/>
</DDD>
<CCC/>
</AAA>
Wyrażenie XPath:
/AAA/DDD/*
Wszystkie elemnty leżące
„głębiej”
Jakub Wojciechowski PJWSTK 2002
XPath cz. 4 atrybuty
XML:
<AAA>
<BBB id=”1”/>
<CCC/>
<BBB id=”2”/>
<BBB name=”bb”/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Wyrażenie XPath:
//BBB[@id=‘2’]
//AAA/BBB[@id=‘2’]
Wyrażenie wybierające
element BBB z atrybutem
id o wartości 2
Jakub Wojciechowski PJWSTK 2002
XPath cz. 5
XML:
<AAA>
<BBB id=”1/>
<BBB id=”2”/>
<BBB id=”3”/>
<BBB/>
<BBB/>
<BBB id=”6”/>
<BBB name=”bb”/>
</AAA>
Wyrażenie XPath:
//BBB[position() mod 2 =0]
Wybierz parzyste elemety BBB
Jakub Wojciechowski PJWSTK 2002
XSLT
• Przetwarzanie dokumentów XML na inne
dokumenty XML (w szczególności na
HTML)
• Zbiór szablonów przekształcających
elementy pasujące do wzorca na np. kod
HTML
Jakub Wojciechowski PJWSTK 2002
XSLT budowa
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
...
</xsl:template>
<xsl:template match="/AAA">
...
</xsl:template>
</xsl:stylesheet>
Jakub Wojciechowski PJWSTK 2002
Zastosowanie XPath w XSLT
<xsl:template match="/">
<html>
<xsl:apply-templates match=”/AA/BB[@color=‘blue’]”/>
</html>
</xsl:template>
<xsl:template match="BB">
<b><xsl:value-of select=”@name”/></b><br/>
</xsl:template>
Jakub Wojciechowski PJWSTK 2002
<xsl:template match="/">
<html>
<xsl:apply-templates
match=”/AA/BB[@color=‘blue’]”
/>
</html>
</xsl:template>
<xsl:template match="/AAA">
<b><xsl:value-of
select=”@name”/></b><br/>
</xsl:template>
<AA>
<BB color="red" name="aaaa"/>
<BB color="blue" name="nazwa"/>
<BB color="red" name="bbbb"/>
<BB color="red" name="inny"/>
<BB color="blue" name="numer"/>
</AA>
<html>
<b>nazwa</b><br/>
<b>numer</b><br/>
</html>
Jakub Wojciechowski PJWSTK 2002
Element <xsl:template>
• Atrybuty:
– name – określa nazwę szablonu
– match – określa do jakich elementów XML ma zostać
użyty
– mode – określa który w szablonów o tej samej nazwie
zostanie użyty
<xsl:template name=”lista”> </xsl: ...>
<xsl:template match=”BB” mode=”wersja1”>
</xsl:template>
Jakub Wojciechowski PJWSTK 2002
Wywoływanie szablonów
• <xsl:apply-templates match=”/scieżka/”/>
Wywołanie pasującego szablonu dla wszystkich
wystąpień danego elementu. Dla każdego
elementu oddzielne wywołanie szablonu.
Możliwe jest posortowanie elementów przed
wywołaniem szablonu.
<xsl:apply-templates match=”/AA/BB”>
<xsl:sort order = "descending" />
</xsl:apply-templates>
Jakub Wojciechowski PJWSTK 2002
Wywoływanie szablonów cz. 2
• <xsl:call-template name=”NazwaSzablonu”>
Pojedyncze wywołanie szablonu.
W przeciwieństwie do xsl:apply-templates,
xsl:call-template nie zmienia aktualnej pozycji w
dokumencie XML.
Jakub Wojciechowski PJWSTK 2002
Wypisywanie wartości
<xsl:value-of select=”/scieżka”/>
Wypisuje wartość znajdującą się pod
podaną ścieżką Xpath np.:
<xsl:value-of select=”/BBB/CCC/@id”/>
Jakub Wojciechowski PJWSTK 2002
Instrukcje warunkowe cz. 1
• <xsl:if test=”warunek”> </xsl:if>
W waruku można podać wyrażenie boolowskie
(np. @attr==‘2’) lub ścieżkę Xpath. Istnienie
elementu pod podaną ścieżką jest równoznaczne z
wartością TRUE; brak elementu => FALSE.
Instrukcja <xsl:if > nie posiada ELSE!
Znaki ‘<‘ i ‘>’ nie mogą być użyte do
porównywania wartości. Zamiast nich
wprowadzono oznaczenie &gt; dla > i &lt; dla <.
Jakub Wojciechowski PJWSTK 2002
Instrukcje warunkowe cz. 2
• <xsl:choose> (odpowiednik switch z Java, C)
<xsl:when test=”warunek1”> ... </xsl:when>
<xsl:when test=”warunek2”> ... </xsl:when>
<xsl:otherwise> ... </xsl:otherwise>
</xsl:choose>
Jakub Wojciechowski PJWSTK 2002
Pętla
• <xsl:for-each select=”/scieżka”> ...
</xsl:for-each>
Przejście po wszystkich elementach
leżących na danej ścieżce. Możliwe jest
sortowanie jak przy xsl:apply-templates:
<xsl:for-each select=”/scieżka”>
<xsl:sort>
</xsl:for-each>
Jakub Wojciechowski PJWSTK 2002
Parametry
• Istnieje możliwość przekazania parametrów
podczas wywoływania szablonu.
<xsl:template name=”szab1”>
<xsl:param name=”SIZE”/>
<xsl:param name=”TYT” select=”brak”/>
<xsl:value-of select=”$SIZE”/>
</xsl:template>
Wywołanie:
<xsl:call-template name=”szab1”>
<xsl:with-param name=”SIZE”>40</xsl:with-param>
<xsl:with-param name=”TYT”><xsl:value-of select=”/BB/@tytul”/>
</xsl:with-param> Jakub Wojciechowski PJWSTK 2002
</xsl:call-template>
Wszystko razem czyli przykład
<nasdaq>
<company>
<name>MSTF</name>
<price>57.69</price>
Dokument XML z kursami
<change>0.02</price>
<vol>31,952,100</vol>
akcji spółek giełdowych:
<link>http://www.microsoft.com</link>
</company>
<company>
<name>ORACLE</name>
<price>11.90</price>
<change>-2.06</price>
<vol>46,174,700</vol>
<link>http://www.oracle.com</link>
</company>
<company>
<name>SUNW</name>
<price>4.14</price>
<change>-3.52</price>
<vol>82,635,500</vol>
<link>http://www.sun.com</link>
</company>
Jakub Wojciechowski PJWSTK 2002
</nasdaq>
Przykład XSLT
<xsl:template match=”/”>
<html>
<table border=”1”>
<tr><td>Nazwa</td> <td>cena</td> <td>zmiana</td> <td>obrót</td> </tr>
<xsl:for-each select=”//company”>
<tr>
<td><a href="{./link}"><xsl:value-of select=”./name”/></a></td>
<td><xsl:value-of select=”./price”/></td>
<td>
<xsl:choose>
<xsl:when test="./change &gt; 0">
<font color="blue"><xsl:value-of select="./change"/>%</font>
</xsl:when>
<xsl:otherwise>
<font color="red"><xsl:value-of select="./change"/>%</font>
</xsl:otherwise>
</xsl:choose>
</td>
<td><xsl:value-of select="./vol"/></td>
</tr>
</xsl:for-each>
</table>
Jakub Wojciechowski PJWSTK 2002
</html>
</xsl:template>
Wynik transformacji
<html>
<table border="1">
<tr><td>Nazwa</td> <td>cena</td> <td>zmiana</td> <td>obrót</td> </tr>
<tr><td><a href="www.microsoft.com">MSFT</a></td> <td>57.69</td> <td><font
color="blue">0.02%</font></td> <td>31,952,100</td> </tr>
<tr><td><a href="www.oracle.com">ORACLE</a></td> <td>11.90</td> <td><font
color="red">-2.06%</font></td> <td>46,174,700</td> </tr>
<tr><td><a href="www.sun.com">SUNW</a></td> <td>4.14</td> <td><font
color="red">-3.52%</font></td> <td>82,635,500</td> </tr>
</table>
</html>
Jakub Wojciechowski PJWSTK 2002
Dziękuje
??? Pytania ???
Jakub Wojciechowski PJWSTK 2002