Presentation of XML Documents, XSLT

References for subject 10

example files

Style sheets:

XSL (generation 1.0):

Tutoriale XSL-FO

Przypisywanie arkusza stylu do dokumentu

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 ).

Example 1.

<?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 :) .

CSS

Selektory

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...

Task 1.

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

  1. pierwszą osobę w każdym dziale
  2. drugie imię (dwie osoby z początku takie posiadają)
  3. numer komórki szefa

Task 2.

Zapisz przyklad.xml i przyklad.css .

Używając odpowiednich selektorów CSS wyróżnij następujące elementy (jeśli się da):

  1. wyróżnienia (wyr),
  2. obiekt o zadanym id,
  3. obiekty parzyste (CSS 3),
  4. obiekty z nazwami,
  5. obiekty z dodatkami,
  6. obiekty bez nazwy,
  7. tylko pierwsze opisy obiektów,
  8. tylko drugie opisy obiektów,
  9. wyróżnienia w dodatkach znajdujących się za opisami,
  10. wyróżnienia w obiektach parzystych,
  11. wyróżnienia w opisach zagnieżdżonych,
  12. wyróżnienia w opisach, ale nie w opisach zagnieżdżonych.

XSLT + XSL-FO

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

Task 3. Styl w XSL-FO

Zmodyfikuj przykładowy arkusz staff/staff-fo.xsl. Postaraj się wykonać m.in. następujące rzeczy:

  1. email kursywą,
  2. nazwa departamentu mneijszą czcionką niż nazwa firmy,
  3. wyświetlanie numerów komórek innym kolorem,
  4. wyrównywanie numerów telefonów tak, aby kończyły się równo jeden pod drugim,
  5. nie łamanie strony w środku wizytówki (osoby)

Task 4. Strona w XSL-FO

Zmodyfikuj szablon strony i (wykorzystując także static-content) dodaj następujące elementy:

  1. lewy margines większy od prawego
  2. powtarzający się na każdej stronie nagłówek z nazwą firmy,
  3. stopka z numerem strony,

Zobaczcie też w przykładach inne możliwości składania stron (oddeven, marker).

XSLT + HTML

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

Task 5.

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.

Task 6.

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

Parametry, XSLT zwracające XML

Task 7.

Do arkusza sklep.xsl prezentującego zawartość sklepu dodaj parametr kat, który ma taki wpływ na działanie:

  • jeśli podany, prezentowane są jedynie towary o określonym id-kategorii,
  • jeśli nie podany, prezentowane są wszystkie towary.

Task 8.

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).

Task 9.

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 → XSLT

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.

Example 2.

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>

Task 10.

(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.

Programowanie w XSLT

Example 3. Silnia

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 &gt; 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>

Task 11.

Analogicznie jak w przykładzie z silnią zaimplementuj liczby Fibonacciego (albo coś trudniejszego, jeśli masz ochotę).


Valid XHTML 1.1Valid CSS