XSL — Extensible Stylesheet Language
Transkrypt
XSL — Extensible Stylesheet Language
. Extensible Stylesheet Language . . XSL — Extensible Stylesheet Language Extensible Stylesheet Language aplikacja języka XML służąca do opisu formatowania dokumentu Cezary Sobaniec Składowe XSL . Extensible Stylesheet Language Transformations (XSLT) — opis transformacji .2 XSL Formatting Objects (XSL-FO) — zestaw znaczników Instytut Informatyki Politechnika Poznańska 1 v2.10, 2012/05/17 reprezentujących obiekty formatujące dokument rozumiane przez przeglądarkę . XML Path Language (XPath) — specy kacje fragmentów dokumentów 3 © 2005–2011 Cezary Sobaniec . Prezentacja dokumentu XML XSL — Extensible Stylesheet Language [1/51] . Formatowanie dokumentów — XSL-FO XSL: bogatsze spojrzenie na dokument CSS: podejście deklaratywne (ale efektywne) XSL: również podejście proceduralne Możliwość dokonywania transformacji dokumentów (XSLT) CSS: praca z całymi elementami XSL: odwołania do komentarzy, instrukcji przetwarzania bardziej zaawansowana kontrola formatowania dokumentu poprzez obiekty formatujące XSL: składnia zgodna z XML CSS: dokładna odpowiedniość elementów z dokumentu i struktury obiektów formatujących XSL: mała (w porównaniu do CSS) ilość narzędzi do przeglądania/tworzenia dokumentów stosujących styl XSL © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [2/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [3/51] . Zastosowania XSLT . Możliwości języka XSLT Generacja tekstu statycznego (np. „Rozdział …”) Transformacja do HTML Opuszczenie fragmentów dokumentu Transformacja do innego dokumentu XML (+ CSS) Przemieszczanie fragmentów tekstów, zmiana kolejności Transformacja do dokumentu z Formatting Objects Powielanie fragmentów (np. tytuły rozdziałów w spisie treści) Sortowanie elementów Obliczenia matematyczne © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [4/51] . Działanie XSLT © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language . Przekształcanie dokumentów XML XSLT przekształca jedno drzewo XML w inne drzewo XML (lub w czysty tekst) Kiedy i gdzie przekształcać? Wynik nie musi być poprawnym dokumentem XML U klienta: dokument XML i styl XSL dostarczane są do przeglądarki, która dokonuje transformacji i wyświetla wyniki Drzewo jest przekształcane w drzewo — automatyczna eliminacja niektórych błędów: Na serwerze: arkusz stylów stosowany jest do dokumentu źródłowego i wynik przetwarzania wysyłany jest do klienta (np. w formacie HTML) <b><i>fragment tekstu</b></i> XSLT nie jest ogólnym językiem przetwarzania tekstów do przekształcania dowolnych danych: dane wejściowe muszą być dokumentem XML Przed instalacją na serwerze: przetwarzanie zewnętrznym programem; klient i serwer mają do czynienia tylko z przetworzonym dokumentem Wynikiem przekształceń może być inny język niż XML, np.: RTF, PostScript, LATEX © 2005–2011 Cezary Sobaniec [5/51] XSL — Extensible Stylesheet Language [6/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [7/51] . Drzewo przekształceń XSLT . Działanie XSLT Szablon XSLT dokument XSL zwiera listę reguł reguła składa się z wzorca i szablonu wyniku przekształcenia wzorzec określa które fragmenty drzewa mają być przekształcane (selektor) szablon zawiera nowe dane i odwołania do oryginalnego drzewa Operatory języka XSLT operatory pozwalające wybierać poszczególne węzły drzewa operatory szeregowania węzłów (np. sortowanie) operatory wypisywania © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [8/51] . Transformacja XSLT © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [9/51] . Przykładowy dokument XML <?xml version=”1.0” encoding=”utf-8”?> <!DOCTYPE book SYSTEM ”ksiazka.dtd”> <book> <chapter id=”wstep”> <title>Wstęp</title> <section id=”temat”> <title>Temat pracy</title> <para>Pierwszy akapit.</para> <para>Drugi akapit.</para> </section> <section id=”def”> <title>Definicja problemu</title> <para>Pierwszy akapit.</para> </section> </chapter> <chapter id=”pods”> <title>Podsumowanie</title> <para>Koniec książki</para> </chapter> </book> . Analiza drzewa dokumentu XML 2. Rekurencyjne przeszukiwanie drzewa wgłąb 1 . Porównanie każdego drzewa ze wzorcem każdej reguły w arkuszu stylu .4 Dopasowanie powoduje zastosowanie szablonu tej reguły 3 © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [10/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [11/51] . Dokument XSLT . Przykład stylu XSLT <?xml version=”1.0”?> <xsl:stylesheet version=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”> Elementy XSLT są częścią przestrzeni nazw http://www.w3.org/1999/XSL/Transform <xsl:template match=”book”> <html><body> <xsl:apply-templates/> </body></html> </xsl:template> typowy pre x xsl element główny <xsl:stylesheet> lub <xsl:transform> (synonimy) <xsl:template match=”title”> <h1><xsl:apply-templates/></h1> </xsl:template> reguły: elementy <xsl:template> szablony wynikowe: zawartość elementów <xsl:template> elementy sterujące: np. <xsl:if>, <xsl:for-each> <xsl:template match=”para”> <p><xsl:apply-templates/></p> </xsl:template> </xsl:stylesheet> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [12/51] . Budowa reguły XSL © 2005–2011 Cezary Sobaniec Wynik transformacji <html> <body> <h1>Wstęp</h1> <h1>Temat pracy</h1> <p>Pierwszy akapit.</p> <p>Drugi akapit.</p> ... </body> </html> XSL — Extensible Stylesheet Language [13/51] . Selektory XPath kierunek::test[predykat] <xsl:template match=”selektor”> szablon </xsl:template> Kierunek określa sposób patrzenia na elementy drzewa względem bieżącego węzła Selektor Test wyrażony standardem XPath wskazuje na elementy drzewa, które mają podlegać przetwarzaniu Predykat test zawartości węzła (dowolne wyrażenie XPath) Szablon dowolny tekst lub poprawnie zagnieżdżony zestaw elementów Selektory konstruowane są podobnie jak ścieżki w systemie plików dodatkowe operatory XSLT (wywołania procedur) selektor zaczynający się od „/” jest selektorem bezwzględnym pozostałe selektory odnoszą się do bieżącego kontekstu © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [14/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [15/51] . Selektory XPath . Selektory XPath — predykaty Predykaty numeryczne / dopasowanie do korzenia dokumentu /E dopasowanie do elementu głównego //E dowolne wystąpienie elementu E w dokumecie E elementu E będący bezpośrednim węzłem podrzędnym bieżącego węzła E1/E2 element E2 będący bezpośrednim potomkiem E1 E1//E2 E2 będący dowolnie zagnieżdżonym potomkiem E1 E[@atr] element E z ustawionym atrybutem atr E1/*/E2 wystąpienie elementu E2 posiadającego „dziadka” w postaci elementu E1 E[@atr=”abc”] element E z ustawionym atrybutem atr na wartość abc .//E dowolne potomne wystąpienie elementu E względem bieżącego węzła E[@atr=”abc”][3] trzeci element E z ustawionym atrybutem atr na wartość abc .. węzeł nadrzędny E[3][@atr=”abc”] trzeci element E o ile ma ustawiony atrybut atr na wartość abc © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language E[3] trzecie wystąpienie elementu potomnego E E1/E2[2] drugie wystąpienie elementu E2 w E1 Testy zawartości [16/51] . Selektory XPath — funkcje © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [17/51] . Selektory XPath — inne wyrażenia Funkcje obsługi zbiorów węzłów position() comment() last() processing-instruction() dopasowanie do węzła będącego instrukcją sterującą count(zbiór węzłów) id(wartość) E[position()=last()] element E będący ostatnim węzłem potomnym E[position()%2=0] elementy E na parzystych pozycjach potomnych E[not(@id)] element E bez ustawionego atrybutu id © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language dopasowanie do węzła będącego komentarzem [18/51] E1|E2 element E1 lub element E2 N:E element E z przestrzeni nazw N * dowolny element potomny bieżącego węzła @* dowolny atrybut bieżącego elementu © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [19/51] . XPath — kierunek przeszukiwania ancestor przodkowie bieżącego elementu ancestor-or-self przodkowie i bieżący element attribute atrybut elementu („@”) descendant potomek bieżącego elementu . XPath — kierunek przeszukiwania descendant-or-self potomek i bieżący element („//”) following, following-sibling elementy występujące za bieżącym elementem w dokumencie preceding, preceding-sibling elementy występujące przed bieżącym elementem w dokumencie namespace przestrzeń nazw bieżącego elementu parent rodzic bieżącego elementu („..”) self bieżący element („.”) © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [20/51] . Selektory XPath — przykłady XSL — Extensible Stylesheet Language [21/51] . Przykład zastosowania selektorów section[title] sekcja posiadająca zagnieżdżony element title section[title|para] sekcja zawierająca tytuł lub akapit section[para/@align] sekcja z akapitem tekstu posiadającym atrybut align *[@id] wszystkie elementy potomne z ustawionym atrybutem id section[title=’Wstęp’] element section zawierający element title z tekstem „Wstęp” ancestor::table element table będący przodkiem bieżącego elementu following-sibling::para/@id atrybuty sąsiednich elementów para za bieżącym © 2005–2011 Cezary Sobaniec © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language Automatyczna numeracja akapitów <xsl:template match=”para”> <xsl:value-of select=”position()”/> <xsl:apply-templates/> </xsl:template> Wersja rozbudowana (i z n) <xsl:template match=”para”> <xsl:value-of select=”position()”/> z <xsl:value-of select=”count(../para)”/> <xsl:apply-templates/> </xsl:template> [22/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [23/51] . Przetwarzanie rekurencyjne . Elementy potomne Przykład dokumentu <para>To jest przykład <span>dokumentu w <span>którym</span> użyto zagnieżdżonego</span> znacznika span.</para> Selektywne przetwarzanie elementów potomnych <xsl:template match=”chapter”> <xsl:apply-templates select=”title”/> </xsl:template> Przykład <xsl:template match=”span”> <i><xsl:apply-templates/></i> </xsl:template> Domyślnie następuje przetwarzanie wszystkich elementów potomnych <xsl:template match=”span//span”> <b><xsl:apply-templates/></b> </xsl:template> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [24/51] . Pobranie wartości © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [25/51] . Tryby pracy Element <xsl:value-of select=”...”/> <xsl:template match=”book”> <xsl:apply-templates mode=”toc”/> <xsl:apply-templates/> </xsl:template> atrybut select określa dokładnie co ma zostać pobrane wartość węzła jest zawsze napisem napis jest połączeniem wszystkich przetwarzanych węzłów tekstowych bez znaczników <xsl:template match=”chapter”> <xsl:apply-templates/> </xsl:template> Przykład <xsl:template match=”chapter” mode=”toc”> <xsl:apply-templates select=”title”/> </xsl:template> <xsl:template match=”chapter”> <xsl:value-of select=”title”/> </xsl:template> Domyślna reguła Wynik <xsl:template match=”*|/” mode=”wartość”> <xsl:apply-templates mode=”wartość”/> </xsl:template> Wstęp Podsumowanie © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [26/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [27/51] . Wyrażenia proceduralne: pętle . Operatory Element <xsl:value-of> można użyć tylko wtedy, gdy wiadomo, że istnieje tylko jedno dziecko określonego typu. Operatory porównania = <xsl:template match=”section”> <xsl:for-each select=”para> <xsl:value-of select=”.”/> </xsl:for-each> </xsl:template> != < > <= >= Operatory < i <= zapisywane są jako < i <= Operatory logiczne or, and, not(), true(), false(), lang(kod) Spis treści Przykłady <xsl:template match=”book”> <ol> <xsl:for-each select=”chapter”> <li><xsl:value-of select=”title”/></li> </xsl:for-each> </ol> </xsl:template> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language para[position()=1] para[position()=1 or position=last()] para[position()=1 and position=last()] section/para[not(position()=1 or position=last())] [28/51] . Operatory arytmetyczne * div [29/51] Element <xsl:if> <xsl:template match=”ol/li”> <xsl:if test=”position()>1”>, </xsl:if> <xsl:apply-templates/> <xsl:if test=”position()=last()”>.</xsl:if> </xsl:template> Operatory - XSL — Extensible Stylesheet Language . Wyrażenia warunkowe liczby reprezentowane są w postaci 64-bitowych liczb zmiennoprzecinkowych + © 2005–2011 Cezary Sobaniec mod Inne funkcje floor() ceiling() round() Przykład sum() <ol> <li>samochód</li> <li>rower</li> <li>kajak</li> </ol> Przykłady <xsl:value-of <xsl:value-of <xsl:template <xsl:template <xsl:value-of © 2005–2011 Cezary Sobaniec select=”2+2”/> select=”@width div @height/> match=”img[@width > 2 * @height]”> match=”para[position() mod 2 = 0]”> select=”sum(img/@width) div count(img)”/> XSL — Extensible Stylesheet Language Wynik samochód, rower, kajak. To samo można uzyskać stosując odpowiednie reguły [30/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [31/51] . Złożona instrukcja warunkowa . Zmienne <xsl:template match=”para”> <xsl:choose> <xsl:when test=”@align=’left’”> <p style=”text-align:left”> <xsl:apply-templates/> </p> </xsl:when> <xsl:when test=”@align=’center’”> <p style=”text-align:center”> <xsl:apply-templates/> </p> </xsl:when> <xsl:otherwise> <p> <xsl:apply-templates/> </p> </xsl:otherwise> </xsl:choose> </xsl:template> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language Deklaracja zmiennych <xsl:variable name=”tytul”>Wstęp</xsl:variable> Odwołanie do zmiennej . w tekście 1 <title><xsl:value-of select=”$tytul”/></title> . jako wartość atrybutu 2 <para color=”{$kolor_tla}”> [32/51] . Makrode nicje © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [33/51] . Łańcuchy tekstowe <xsl:template name=”tytul”> <h1><font face=”Arial,Helvetica” color=”blue”> <xsl:value-of select=”.”/> </font></h1> </xsl:template> Funkcje starts-with(napis, pre ks) contains(napis, tekst) Wywołanie makrode nicji substring(napis, pozycja, długość) substring-before(napis, marker) <xsl:template match=”chapter/title”> <xsl:call-template name=”tytul”/> </xsl:template> substring-after(napis, marker) string-length(napis) translate(napis, z, na) Makrode nicja z argumentami concat(…) <xsl:template name=”tytul”> <xsl:param name=”url”>index.html</xsl:param> <h1><a href=”{$url}”><xsl:value-of select=”.”/></a></h1> </xsl:template> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language format-number(liczba, format, locale) [34/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [35/51] . Kopiowanie bieżącej zawartości węzła . Numeracja węzłów — element <xsl:number> <xsl:template match=”chapter”> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match=”para”> <p><xsl:number/>. <xsl:apply-templates/></p> </xsl:template> Odwołania do innych wartości Przekształcenie tożsamościowe <xsl:template match=”section/title”> <h2><xsl:number count=”section”/>. <xsl:apply-templates/></h2> </xsl:template> <xsl:template match=”@*|node()”> <xsl:copy> <xsl:apply-templates select=”@*|node()”/> </xsl:copy> </xsl:template> Numeracja hierarchiczna <xsl:template match=”section/title”> <h2><xsl:number level=”multiple” count=”chapter|section” format=”1.1 ”> <xsl:apply-templates/> </h2> </xsl:template> Kopiowanie całych węzłów <xsl:template match=”chapter”> <xsl:copy-of select=”title”/> </xsl:template> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [36/51] . Sortowanie — element <xsl:sort> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [37/51] . Białe znaki Atrybut xsl:space <xsl:template match=”section”> <xsl:apply-templates> <xsl:sort select=”para”/> </xsl:apply-templates> </xsl:template> <h1 xsl:space=”preserve”> Wprowadzenie </h1> Dopuszczalne wartości: preserve i default Globalne ustawienia Parametry sortowania <xsl:strip-space elements=”h1 h2 h3”/> <xsl:preserve-space elements=”*”/> . Sortowanie wartości liczbowych 1 <xsl:sort data-type=”number” select=”szerokosc”/> . Kierunek Element <xsl:text> 2 <xsl:sort order=”descending” case-order=”upper-first”/> <xsl:template match=”title”> <xsl:text>Rozdział. </xsl:text> <xsl:apply-templates/> </xsl:template> Uwzględniana jest wartość atrybutu xml:lang! © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [38/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [39/51] . Translacja dokumentów XML . Generowanie elementów Wejście Wyjście Wejście Wyjście <figura typ=”kwadrat” x=”100” y=”100”/> <kwadrat szer=”100” wys=”100”/> <figura typ=”kwadrat” x=”100” y=”100”/> <figura typ=”prostokąt” x=”100” y=”200”/> <kwadrat> <szer>100</szer> <wys>100</wys> </kwadrat> <prostokat> <szer>100</szer> <wys>200</wys> </prostokat> Rozwiązanie I (niepoprawne) <xsl:template match=”figura[@typ=’kwadrat’]”> <kwadrat szer=”<xsl:value-of select=”@x”/>” wys=”<xsl:value-of select=”@y”/>” /> </xsl:template> Rozwiązanie <xsl:template match=”figura”> <xsl:element name=”{@typ}”> <szer><xsl:value-of select=”{@x}”/></szer> <wys><xsl:value-of select=”{@y}”/></wys> </xsl:element> </xsl:template> Rozwiązanie II <xsl:template match=”figura[@typ=’kwadrat’]”> <kwadrat szer=”{@x}” wys=”{@y}”/> </xsl:template> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [40/51] . Importowanie reguł z zewnętrznych źródeł © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [41/51] . Wyprowadzanie wyniku Nowe reguły nadpisują stare Metody <xsl:import href=”http://www.put.poznan.pl/put.xsl”/> <xsl:import href=”http://www.cs.put.poznan.pl/cs.xsl”/> XML HTML Odwołanie do importowanych reguł czysty tekst <xsl:apply-imports/> Określenie metody Wykorzystywane będą tylko reguły importowane. <xsl:output method=”html” indent=”yes”/> Włączanie <xsl:template name=”tytul”> <h1><apply-templates/></h1><hr/> </xsl:template> w dowolnym miejscu arkusza na najwyższym poziomie reguły włączone mają ten sam priorytet co lokalne <xsl:include href=”program.xsl”/> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [42/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [43/51] . Formatowanie dokumentów — XSL-FO . Język formatowania XSL Przykłady obiektów formatujących Rozszerzenia XSL-FO względem CSS inne sposoby pisania niż europejskie przypisy, adnotacje na marginesie numery stron w odnośnikach block inline float page-number inline-graphics list-block table table-caption table-cell rozbudowane formatowanie list różne układy stron w dokumencie podział stron na wyróżnione obszary model formatowania oparty jest na prostokątach (blokach) bloki są puste, zawierają tekst lub inne obiekty formatujące © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [44/51] . Rodzaje obiektów formatujących [45/51] Nazwy i wartości poszczególnych właściwości są analogiczne do CSS. Przykład CSS Obiekty blokowe zawierają inne obiekty blokowe, obiekty wierszowe i treść. Przykłady: akapit, pozycja listy. p { font-family: Helvetica, sans-serif } Przykład XSL Obiekty wierszowe zawierają inne obiekty wierszowe i treść. Przykłady: pojedynczy znak, numer przypisu, nazwa. XSL — Extensible Stylesheet Language XSL — Extensible Stylesheet Language . Właściwości elementów formatujących Pojemniki zawierają mniejsze pojemniki i obiekty blokowe. Przykłady: strona, nagłówek, stopka, margines. © 2005–2011 Cezary Sobaniec © 2005–2011 Cezary Sobaniec <fo:block font-family=”Helvetica sans-serif”> ... </fo:block> [46/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [47/51] . Przykładowe drzewo obiektów formatujących . Formatowanie dokumentu <?xml version=”1.0” encoding=”utf-8”?> <fo:root xmlns:fo=”http://www.w3.org/1999/XSL/Format”> <fo:layout-master-set> <fo:simple-page-master master-name=”strona”> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference=”strona”> <fo:flow flow-name=”xsl-region-body”> <fo:block font-size=”18pt” font-family=”sans-serif”> Wprowadzenie </fo:block> <fo:block font-size=”12pt” font-family=”serif”> Akapit pierwszy... </fo:block> </fo:flow> </fo:page-sequence> </fo:root> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [48/51] . Kompletny styl XSL (I) © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [49/51] . Kompletny styl XSL (II) <?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”> <xsl:template match=”book/title”> <fo:block font-size=”18pt” font-family=”sans-serif” text-align=”center”> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match=”/”> <fo:root xmlns:fo=”http://www.w3.org/1999/XSL/Format”> <fo:layout-master-set> <fo:simple-page-master master-name=”strona”> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <xsl:template match=”chapter”> <fo:block font-size=”16pt” font-family=”sans-serif”> <xsl:value-of select=”title”/> </fo:block> </xsl:template> <fo:page-sequence master-reference=”strona”> <fo:flow flow-name=”xsl-region-body”> <xsl:apply-templates/> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language </xsl:stylesheet> [50/51] © 2005–2011 Cezary Sobaniec XSL — Extensible Stylesheet Language [51/51]