Ćwiczenie 11: Transformacje XSL
Dołączanie dokumentu z transformacjami do pliku XML
<?xml-stylesheet type="text/xsl" href="nazwa pliku xsl"?>
Budowa pliku XSL
XSL jest językiem opartym na składni XML
Definicja pliku XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
…
Tu wstawić deklaracje stylów
…
</xsl:stylesheet>
Tworzenie szablonów
Szablony są podstawowym elementem budulcowym transformat XSL. Deklaracja szablonu wygląda następująco:
<xsl:template match=”…”>
</xsl:template>
gdzie wartość match może być następująca:
match=”/” - główny element dokumentu
match=”nazwa” - element o nazwie węzła =”nazwa”
match=”przodek/nazwa” - element o nazwie węzła =”nazwa” posiadający ojca o nazwie=”przodek”
match=”przodek//nazwa” - element o nazwie węzła =”nazwa” posiadający węzeł o nazwie=”przodek” gdziekolwiek nad sobą w strukturze dokumentu
match=”nazwa1 | nazwa 2 | nazwa3 …” -element pasujący do którejkolwiek z nazw
match=”nazwa-elementu[@nazwa-atrybutu=”wartość”]” - element o danej nazwie posiadający atrybut o danej nazwie i wartości=”wartość”.
match=”nazwa-elementu[@nazwa-atrybutu]” - element posiadający atrybut o danej nazwie
match=”nazwa-elementu[nazwa-elementu]” - element o danej nazwie posiadający dziecko o danej nazwie
match=”id(aaa)” -element o ID=”aaa”
► Zacznijmy od zbudowania prostej transformacji wyświetlającej prosty plik html wyświetlający tytuł dokumentu „Procesory z dnia: data” gdzie data będzie pobierana z pliku „procesory.xml”.
do pustego pliku procesory1.xsl dopisz
<xsl:template match="/">
<html>
<head>
<title>Procesory!!!</title>
</head>
<body bgcolor="white" vlink="blue" alinku="blue" link="blue">
<font color="black">
<h1> <center>Cennik procesorow z dnia:
<xsl:value-of select="procesory/@data"/>
</center>
</h1>
</font>
</body>
</html>
</xsl:template>
► Aby obejrzeć wynik podłącz plik ze stylami do pliku „procesory1.xml” i uruchom ten plik w IE.
-wstaw wiersz <?xml-stylesheet type="text/xsl" href="procesory1.xsl"?> do pliku „procesory1.xml”
- uruchom IE
Przetwarzanie elementów
► Włącz przetwarzanie pozostałych elementów.
- wstaw wiersz <xsl:apply-templates/> przed znacznikiem </body>
<xsl:apply-templates/> pozwala na przetwarzanie wszystkich elementów dla których zdefiniowane są wzorce. Aby w danym miejscu przetwarzać tylko wybrany element należy użyć <xsl:apply-templates select=”scieżka do elementu”/>
np. <xsl:apply-templates select=”procesory/procesor/cena”/>
- uruchom IE
► Dodaj własną obsługę elementów.
- dodaj do pliku z transformacjami następujące wiersze wprowadzające obsługę elementu o nazwie „typ”
<xsl:template match="typ">
Procesor: <xsl:value-of select="."/>
<br/>
</xsl:template>
- dodaj obsługę węzłów dla elementów „cena” oraz „link”
- uruchom IE
► Dodaj wyświetlanie atrybutów .
-odwołanie do atrybutu poprzedzone jest znakiem @
<xsl:value-of - select=”@typ”/> wyświetla atrybut typ aktualnego węzła.
- uruchom IE
►Wyświetl pogrupowane dane procesora (typ wraz z ceną i linkami).
-stwórz wzorzec dla elementu „procesor” i w nim zawrzyj obsługę elementów typ, cena i link w taki sposób aby wyświetlane były one zawsze w tej samej kolejności (typ , potem cena potem link)
►Dodaj obsługę wielu elementów typu cena (o ile jeszcze nie działa).
- wstaw w odpowiednie miejsce - przy elemencie procesor
<xsl:for-each select="./cena">
Cena (<xsl:value-of select="@typ"/>): <xsl:value-of select="."/> <br/>
</xsl:for-each>
►Dodaj warunkową obsługę linków.
zauważ, że nie każdy element „procesor” posiada element „link”. Jeżeli element „procesor” nie posiada elementu „link” należy wypisać stosowny komunikat. Użyj do tego tagów
<xsl:choose>
<xsl:when test=”warunek”>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
►Wprowadź sortowanie procesorów.
-posortuj elementy o nazwie „procesor” według typu. Zamień <xsl:apply-templates/>
<xsl:apply-templates select="procesory/procesor">
<xsl:sort select="typ"/>
</xsl:apply-templates>
►Wprowadź sortowanie cen - najpierw detaliczna potem hurtowa.
►Wprowadź numerowanie procesorów.
-użyj elementu <xsl:number value="pozycja" format="1. "/> aby wprowadzić numerowanie elementów. Należy wstawić to w template dla elementu „procesora”. Do aktualnej pozycji można odwołać się poprzez metodę „position()”
►Formatowanie liczb.
W celu sformatowania liczb należy określi właściwości formatowania (jaki znak rozdziela tysiące itp.). Używa się do tego deklaracji globalnej <xsl:decimal-format>
<xsl:decimal-format grouping-separator=" " name="polskie"/>
Formatowanie odbywa się poprzez wywołanie operacji format-number(co formatujemy,'format','nazwa formatu)
Np.
<xsl:value-of select="format-number (current(),'### ### ###.00','polskie')"/>
W celu dokładnego zapoznania się z dostępnymi formatami wejdź na stronę:
►Zadania.
Stwórz plik xsl dla pliku sasiedzi.xml wyświetlający następujące informacje:
Ponumerowaną listę Państw posortowanych według liczby mieszkańców
W ramach każdego państwa : nazwę, stolicę, obszar, ludność
Główne miasto i główne rzeki tylko w przypadku gdy istnieją, jeżeli nie ma głównych rzek należy wypisać odpowiednią informację
Na końcu sumaryczną liczbę mieszkańców oraz sumaryczny obszar:
Użyj operacji sum podając jako argument które węzły chcesz sumować
Np.:
<xsl:value-of select="format-number(sum(procesory/procesor/cena),'### ###.00','polskie')"/>.