Style sheets:
XSL (generation 1.0):
Tutoriale XSL-FO
Istnieje standardowy sposób na zapisanie w dokumencie XML informacji
o arkuszu
stylu, którego należy użyć do jego prezentacji. Służy do
tego instrukcja przetwarzania
xml-stylesheet
umieszczona w początkowej części dokumentu (przed elementem
głównym).
Poza podstawowym, można podać także alternatywne style,
identyfikowane po nazwie (
title
).
<?xml-stylesheet type="text/xsl" href="styl.xsl"?>
<?xml-stylesheet type="text/css" href="styl.css" title="Domyślny"?> <?xml-stylesheet type="text/css" href="styl-specjalny.css" title="Specjalny" alternate="yes"?>
Jest to nawet wyspecyfikowane w odpowiedniej rekomendacji :) .
Selektory to wzorce określające elementy, których dotyczy reguła. Mają intuicyjną składnię i dość dużą siłę wyrazu, mniejszą jednak niż ścieżki XPath występujące w XSLT.
Można określać elementy w oparciu o ich nazwy, zagnieżdżenie w
dokumencie, wartości atrybutów.
W przypadku wizualizowania HTML specjalne znaczenie mają atrybuty
class
i
id
, w arkuszu można zdefiniować styl dla elementów podanej klasy i o
podanym identyfikatorze.
Więcej o selektorach...
Otwórz w przeglądarce plik staff/staff.xml(z zipa).
Odkomentuj instrukcję xml-stylesheet
i odśwież widok w przeglądarce.
Sprawdź style alternatywne (w Firefoxie Widok / Styl strony)
Wprowadź zmiany do stylu - wyróżnij w pewien (dowolny) sposób elementy
Zapisz przyklad.xml i przyklad.css .
Używając odpowiednich selektorów CSS wyróżnij następujące elementy (jeśli się da):
wyr
),Idea i podstawy opisane na wykładzie, można też zajrzeć do rekomendacji i tutoriali podanych na początku strony.
Do przekształceń FO używamy narzędzia Apache FOP.
fop -xml zrodlo.xml -xsl arkusz.xsl -pdf wynik.pdf
Samo przekształcenie XSLT można wykonać poleceniem
xsltproc -o wynik.fo arkusz.xsl zrodlo.xml
Zmodyfikuj przykładowy arkusz staff/staff-fo.xsl. Postaraj się wykonać m.in. następujące rzeczy:
Zmodyfikuj szablon strony i (wykorzystując także static-content
) dodaj następujące elementy:
Zobaczcie też w przykładach inne możliwości składania stron (oddeven, marker).
Przekształcenia w wersji 1.0 można wykonywać w Eclipse (Run as XSL Transformation) lub w Linuxowym command-line:
xsltproc -o wynik.html arkusz.xsl zrodlo.xml
Przekształcenia w wersji 2.0 można wykonywać za pomocą Saxona w Eclipse (po skonfigurowaniu Saxona) lub w Javie z command-line:
java -cp saxon9.jar net.sf.saxon.Transform -s:plik.xml -o:wynik.html arkusz.xsl
Uruchom przykład staff/staff-html.xsl
Weź plik sklep.xml
Napisz arkusz, który wypisuje kolejno wszystkie kategorie i dla każdej kategorii wszystkie towary z tej kategorii.
Użyj elementów HTML (np. ul
, li
) do sformatowania wyniku.
To samo, ale dla pliku sklep-bez-kategorii.xml. Tak, żeby kategorie się nie powtarzały!
Można to zrobić używając for-each-group
w XSLT 2.0
ale chciałbym, abyście zrobili to też "ręcznie" w XSLT 1.0
Do arkusza sklep.xsl
prezentującego zawartość sklepu dodaj parametr kat
,
który ma taki wpływ na działanie:
id-kategorii
,Stwórz arkusz filtrujący towary ze względu na kategorie zgodnie z parametrem kat
, jak w powyższym zadaniu,
i wypisujący wynik w postaci XML o takiej samej strukturze (element sklep
, w nim elementy towar
).
Użyj instrukcji do kopiowania węzłów (copy
, copy-of
).
Stwórz arkusz tworzący w wyniku XML o takiej samej strukturze jak wejściowy,
ale zmieniający ceny towarów ze wskazanej kategorii o wskazaną różnicę procentową
(arkusz może mieć np. parametry kat
i zmiana
).
XSLT jest też XML-em, a więc może być wyprodukowany jako wynik XSLT. Trzeba zrobić coś, żeby odróżnić elementy XSLT,
ktróre mają być interpretowane teraz, od elementów XSLT, które mają być wynikiem transformacji.
Umożliwia to deklaracja namespace-alias
.
Przykład z rekomendacji.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias"> <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/> <xsl:template match="/"> <axsl:stylesheet> <xsl:apply-templates/> </axsl:stylesheet> </xsl:template> <xsl:template match="block"> <axsl:template match="{.}"> <fo:block><axsl:apply-templates/></fo:block> </axsl:template> </xsl:template> </xsl:stylesheet>
(Wyobrażamy sobie że) Baza danych eksportuje dane (pojedyncze tabele) w postaci XML. Każdy wiersz wyniku jest umieszczony w elemencie wiersz
,
a poszczególne pola w wierszu mają nazwy takie jak kolumny tabeli. Przykłady dokumentów: tabela1.xml tabela1a.xml tabela2.xml.
W dokumentach takich jak schemat1.xml i schemat2.xml (DTD) opisane są „schematy” tabeli wraz z metadanymi do wykorzystania przy prezentacji (etykiety kolumn, czy pokazywać kolumnę, czy i jak sortować po podanej kolumnie, sortujemy w takiej kolejności, w jakiej podano kolumny).
Należy napisać arkusz XSLT, który na podstawie schematu tabeli utworzy w wyniku arkusz XSLT, służący do prezentacji tabel zgodnych z tym schematem. Wynikowy arkusz powinien prezentować tabele w postaci tabel HTML, uwzględniając dodatkowe informacje podane w schemacie.
Files: arkusz v. 1.0, dokument uruchamiający, arkusz v. 2.0 - funkcja.
<xsl:template name="silnia"> <xsl:param name="n"/> <xsl:param name="res" select="1"/> <xsl:choose> <xsl:when test="$n > 1"> <xsl:call-template name="silnia"> <xsl:with-param name="n" select="$n - 1"/> <xsl:with-param name="res" select="$n * $res"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$res"/> </xsl:otherwise> </xsl:choose> </xsl:template>
Analogicznie jak w przykładzie z silnią zaimplementuj liczby Fibonacciego (albo coś trudniejszego, jeśli masz ochotę).