4 dr inż. Robert Berezowski e-mail: beny@ie.tu.koszalin.pl Ul. Śniadeckich 2 Pokój 223A Politechnika Koszalińska Wydział Elektroniki i Informatyki Katedra Inżynierii Komputerowej 1
XPath nawigacja i wyszukiwanie Dokument XML budowa strukturalna - drzewko Nazwy znaczników opisują dane Znaczenie elementów zależy od kontekstu (tytuł publikacji, tytuł naukowy) Dla szybkich przekształceń niezbędne jest wsparcie dodatkowymi aplikacjami potrzeba opisu dostępu do elementów -XPath XPath - język deklaratywny służący wskazywaniu elementów, atrybutów, lub całych fragmentów dokumentu XML (wyszukiwaniu informacji) 2
XPath nawigacja i wyszukiwanie Zwięzła nie-xml-owa składnia, przyjęta w celu umożliwienia umieszczania wyrażeń XPath w wartościach atrybutów oraz w URI. Zastosowanie: różne technologie związane z XML: W transformacjach XSLT W odsyłaczach Xlink W wyrażeniach Xpointer W schematach XMLSchema W pytaniach Xquery 3
XPath - właściwości Wyrażenie XPath składa się z: kroków (step), które tworzą ścieżkę (path). krok Element, atrybut, funkcja Kroki rozdzielane są symbolem / Kolejne kroki (ścieżka) ograniczają wybierany obszar /root/step/finger /auto/fiat/uno/2004/lipiec /dysk/katalog/podkatalog/plik Wyrażenia XPath mogą zwracać następujące wartości: Wartość logiczna boolean; Liczba number; Łańcuch tekstowy string; Zbiór węzłów node-set. 4
XPath - właściwości Wyrażenia danego kroku uzależnione są od poprzednich kroków lub od ROOT Na kontekst składają się: Bieżący węzeł (tzw. context node); Dwie dodatnie liczby naturalne (pozycja kontekstu - context position oraz rozmiar kontekstu - context size); Wiązania zmiennych; Biblioteka dostępnych funkcji; Zadeklarowane przestrzenie nazwowe widoczne w zakresie wyrażenia. Można podawać alternatywne ścieżki w postaci tzw. wzorca (pattern). Poszczególne ścieżki są wówczas porozdzielane symbolami. 5
XPath węzeł cały element wraz z podelementami, tekstami, komentarzami. /kantor/notowanie[2] /kantor/notowanie/data/ kantor Zależności pomiędzy węzłami: root - korzeń ancestor - przodek parent rodzic self bieżący sibling rodzeństwo preceding poprzednik following - następnik descendant potomek child - dziecko notowanie notowanie wydarzenie data kursy dzien rok korona miesiac hrywna dolar euro funt 6
PROGRAM TV 7
XPath dostęp do węzłów Bezpośredni dostęp (ścieżka od korzenia): /kantor/notowanie[2]/data /kantor/notowanie/kursy/euro dostęp do węzłów w zależności od ich położenia względem węzła odniesienia (instrukcje języka XPath): notowanie/kursy child węzły dzieci descendant węzły potomkowie parent węzeł rodzic ancestor węzły przodkowie preceding wszystkie poprzednie węzły following wszystkie kolejne węzły preceding-sibling poprzedniki na tym samym poziomie following-sibling następniki na tym samym poziomie self bieżący descendant-or-self suma decendant i self ancestor-or-self suma ancestor i self 8
XPath dostęp do węzłów Bezpośredni dostęp (ścieżka od korzenia): /kantor/notowanie[2]/data /kantor/notowanie/kursy/euro dostęp do węzłów w zależności od ich położenia względem węzła odniesienia (instrukcje języka XPath): child węzły dzieci /program/child::* /program/kanal/child::* /program/child::* 9
/program/kanal[3]/audycja/parent::* /program/descendant ::* 10 /program/kanal[3]/audycja/ancestor::*
/program/kanal[3]/audycja[3]/following::* /program/kanal[3]/audycja[3]/preceding::* 11 /program/kanal[3]/audycja[3]/following-sibling::* /program/kanal[3]/audycja[3]/preceding-sibling::*
XPath dostęp do węzłów Użycie instrukcji języka XPath: Instrukcja::nazwa elementu lub Instrukcja::funkcja funkcje: o node() wyszukanie węzła o text() wyszukanie tekstu (treści) o comment() wyszukanie komentarza o processing-instruction() wyszukanie instrukcji przetwarzającej Przykład: preceding::data following-sibling::text() Skróty instrukcji języka XPath: child:: parent::node().. descendant-or-self::node() // self::node(). attribute:: @ [position()=5] - [5] tzw. predykat 12
XPath - predykaty Wyszukiwanie węzłów o określonej zawartości tekstowej./data[dzien>12], //kursy[funt=5.99], //data[miesiac=1] Operatory porównania i logiczne: Równy - = Nierówny -!= Większy od - > Większy lub równy - >= Mniejszy od - < Mniejszy lub równy - <= Iloczyn - and Alternatywa - or Zaprzeczenie - not Operatory matematyczne Dodawanie - + Odejmowanie - - Mnożenie - * Dzielenie - div modulo - mod 13
XPath funkcje tekstowe Operacje dotyczące tekstu: concat(tekst1,tekst2..) łączenie tekstów contains(tekst, wzór) sprawdzenie czy tekst zawiera wzór) normalize-space(tekst) usuwa zbędne spacje starts-with(tekst,wzór)- sprawdzenie czy tekst zaczyna sięod wzoru string-length(tekst)- obliczenie długości tekstu substring(tekst,początek,długość) wycina z tekstu od wskazanego miejsca określona ilość znaków substring-after(tekst, wzor)- zwraca tekst po wystąpieniu określonego wzorca substring-before(tekst, wzor)- zwraca tekst występujący przed wzorcem translate(tekst, stare, nowe) zamienia w tekście stare znaki na nowe 14
XPath - funkcje Operacje dotyczące liczb: ceiling(liczba) zwraca liczbę całkowitą większą bądź równą danej liczbie floor(liczba) - zwraca liczbę całkowitą mniejszą bądź równą danej liczbie round(liczba) zwraca najbliższą liczbę całkowitą sum(zbiór.węzłów) sumuje wartości węzłów Pozostałe operacje: count(element) zwraca liczbę wystąpień elementów position() podaje pozycję elementu last() podaje pozycję ostatniego elementu name() podaje nazwę elementu 15
<kantor> <notowanie data="2005.01.16"> <kursy><dolar>3.82</dolar><funt>6.02</funt><euro>4.18</euro><hrywna>0.62</hrywna></kursy> </notowanie> <notowanie data="2004.01.17"> <kursy><dolar>3.90</dolar><funt>6.06</funt><euro>4.14</euro><hrywna>0.66</hrywna></kursy> </notowanie> <notowanie data="2005.07.15"> <kursy><dolar>3.90</dolar><funt>6.00</funt><euro>4.22</euro><hrywna>0.68</hrywna></kursy> </notowanie> <notowanie data="2004.03.12"> <kursy><dolar>4.02</dolar><funt>5.96</funt><euro>4.24</euro><hrywna>0.70</hrywna></kursy> </notowanie> </kantor> kantor/notowanie[2]/*/*[position()=3] kantor/notowanie[2]/*/*[position()=last()] kantor/notowanie[2]/*/*[position()>2] kantor/notowanie[1]/*/*[position()<last()] translate(kantor/notowanie[1]/@data,'.','-') kantor/notowanie[substring(@data,1,4)=2004]/kursy/dolar 16
17 6,02 4,18 0,62 3,90 6,06 4,14 0,66 3,90 6,00 4,22 0,68 4,02 5,96 4,24 0,70 kantor notowanie notowanie notowanie notowanie kursy kursy kursy kursy dolar hrywna funt euro dolar funt euro hrywna dolar funt euro hrywna dolar funt euro hrywna @data 2005.01.16 @data 2005.01.16 @data 2005.01.16 @data 2005.01.16 3,82 sum(//dolar) div count(//dolar) //*[name()='dolar'] kantor/notowanie[2]/preceding-sibling::* kantor/notowanie[3]/kursy/dolar/following-sibling::* kantor/notowanie[2]/*/*[2]/preceding-sibling::*
Rozszerzalny język stylów XSL XSL (extensible Style Language) kompletna i oficjalna propozycja języka do przekształcania i wyświetlania dokumentów XML XSLT język przekształceń; Polega na analizie dokumentu XML i podejmowaniu decyzji w zależności od napotkanych elementów; Można użyć m.in. do zmiany układu danych, pokazania tylko wybranych elementów, przekształceniu xml na różne formaty (html, tekst, latex) XSL-FO język formatujący obiekty; Nie jest jeszcze obsługiwany przez przeglądarki; XSL XML XSL Procesor HTML (or XML or text) 18
Procesory XSLT Uruchamiane w linii poleceń (fizyczne stworzenie pliku wynikowego): xalan - darmowy, Java - http://www.apache.org xt - darmowy, Java - http://www.jclark.com saxon - darmowy, Java http://users.iclway.co.uk/mhkay/saxon utx darmowy, DOS, Unicorn Enterprises S.A. msxsl dostarczany przez Microsoft Przekształcanie XSLT w IE6 lub Netscape7 (efekty przekształcenia widoczne w oknie przeglądarki) <?xml version="1.0"?> <?xml-stylesheet href="kantor.xsl" type="text/xsl"?> <kantor> <notowanie>... </kantor> 19
Przekształcenie XSLT Wyszukiwanie w arkuszu styli XSLT reguł-instrukcji dotyczących przetwarzania; XSLT jest językiem deklaratywnym opartym na tzw. regułach przekształceń; Reguły składają się z: Szablonu, który określa jakich węzłów dotyczy dana reguła; Instrukcji opisujących przekształcenie węzła; 20
Przykładowy dokument xml <?xml-stylesheet href="kantor.xsl" type="text/xsl"?> <kantor> <notowanie kolor="yellow"> <data> <dzien>11</dzien> <miesiac>03</miesiac> <rok>2004</rok> </data> <kursy> <dolar>3.79</dolar> <funt>5.99</funt> <euro>4.22</euro> <hrywna>0.55</hrywna> <korona>0.88</korona> </kursy> </notowanie> <notowanie kolor= orange"> <data> <dzien>11</dzien> <miesiac>03</miesiac> <rok>2004</rok> </data> <kursy> <dolar>3.73</dolar> <funt>6.03</funt> <euro>4.20</euro> <hrywna>0.51</hrywna> <korona>0.88</korona> </kursy> </notowanie> </kantor> 21
Tworzenie Arkusz Stylów XSLT Dołączenie pliku XSL deklaracja w pliku *.XML: <?xml-stylesheet type="text/xsl" href="historia.xsl"?> Definicja plik *.XSL: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> lub <xsl:stylesheet xmlns:xsl= http://www.w3.org/tr/wd-xsl > - IE5 <xsl:output method= text"/> typ wyniku <xsl:template match="/"> definicja reguły głównej Kantorek! <xsl:value-of select="kantor/notowanie/data"/> <xsl:template match= xxxxx">... </xsl:stylesheet> definicja kolejnej reguły (dla znacznika <xxxx>) Wynik w Notatniku: Kantorek! 11 03 2004 22
Tworzenie Arkusz Stylów XSLT Dołączenie pliku XSL deklaracja w pliku *.XML: <?xml-stylesheet type="text/xsl" href="historia.xsl"?> Definicja plik *.XSL: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> lub <xsl:stylesheet xmlns:xsl= http://www.w3.org/tr/wd-xsl > - IE5 <xsl:output method="html"/> typ wyniku <xsl:template match="/"> <HTML> <HEAD> <TITLE>Kantorek</TITLE> </HEAD> <BODY> Kantorek! <br/> <xsl:value-of select="kantor/notowanie/data"/> </BODY> </HTML> </xsl:stylesheet> Wynik w przeglądarce: definicja reguły głównej <HTML> <HEAD> <TITLE>Kantorek</TITLE> </HEAD> <BODY> Kantorek! <br> 11 03 2004 </BODY> </HTML> 23
Reguły (xsl:template) Reguły XSLT: <xsl:template match= (XPath)">... (treść) Ścieżka XPath okrśla węzły dla których reguła obowiązuje Treść (w przypadku uruchomienia reguły) określa jakie elementy zostaną wypisane na wyjście Mogą zostać użyte dodatkowe instrukcje XSLT Przetwarzanie rozpoczyna się od reguły głównej (match= / ) Ukośnik "/" jest wzorcem reprezentującym element przed elementem głównym (XPath); Kolejne reguły mogą rekurencyjnie wywoływać reguły dla innych węzłów Wywołanie kolejnych reguł odbywa się za pomocą instrukcji <xsl:apply-templates select= nazwa /> lub <xsl:apply-templates/> 24
Reguły (xsl:template) Wywołanie reguły odbywa się za pomocą instrukcji <xsl:apply-templates select= nazwa /> Jeżeli chcemy wywołać reguły dla wszystkich dzieci to wystarczy wpisać: <xsl:apply-templates/> Elementy nieopisane posiadają regułę wbudowaną: <xsl:template match= *"> <xsl:apply-templates/> <xsl:template match="text() @*"> <xsl:value-of select="."/> Jeżeli jest więcej węzłów pasujących do określonego węzła to atrybutem priority elementu <xsl:template> można określić, która reguła ma być użyta 25
Reguły Przykładowy arkusz styli xsl <xsl:stylesheet> <xsl:template match= / > akcja + wywołanie kolejnych elementów dzieci) <xsl:template match= notowanie > akcja + wywołanie kolejnych elementów dzieci)... </xsl:stylesheet> <xsl:template match="/">kantorek! <xsl:apply-templates select="kantor/notowanie"/> <xsl:template match="notowanie"> <xsl:text> </xsl:text><xsl:value-of select="data"/> --> <xsl:apply-templates select="kursy"/> <xsl:template match="kursy"><xsl:apply-templates/> <xsl:template match="*"> <xsl:value-of select="name()"/> - <xsl:value-of select="."/><xsl:text> </xsl:text> 26
27
Węzeł główny i węzły elementów alternatywnie może zostać użyty atrybut name, zawierający dowolną nazwę, służącą do uruchomienia reguły (template) poleceniem xsl:call-template. Wynik jest produkowany za każdym razem gdy zostanie uruchomiona ta reguła. Przykład <xsl:template match= / > <xsl:call-template name= wydruk />... <xsl:template match="/"> <br/> początek reguły / <xsl:call-template name="naglowek"/> <xsl:apply-templates/> <xsl:call-template name="stopka"/> <br/> koniec reguły / <xsl:template name="naglowek"> <br/> Program telewizyjny wybrane audycje <br/> <xsl:template name="stopka"> <br/> a tu jest data, godzina i numer strony <br/> 28
Generowanie kodu HTML Arkusze XSLT zawierają: Instrukcje opisują sposób przekształcania dokumentu XML (XSL:nazwa); Literały dodawane są do wyniku w takiej postaci jak występują; Aby przekształcić dokument XML na HTML za pomocą XSLT należy: W elemencie głównym dołączyć nagłówek HTML (<html>, <head>, <body>); W pozostałych regułach dołączać dodatkowe formatowanie; Dopisywany html ma być zgodny z XML Rozróżniane są wielkości liter; Atrybuty muszą być ujęte w cudzysłowy; Każdy element musi składać się ze znacznika początkowego i końcowego 29
Zawartość węzła Wyświetlenie zawartości węzła <xsl:template match= / > - określenie węzła odniesienia określenie elementu pobieranego (w stosunku do węzła odniesienia) z pliku XML (atrybutem select określamy wybieraną wartość) <xsl:value-of select=. /> <xsl:value-of select= kantorek/notowanie/data /> Wartość węzła to tekst w nim zawarty; Jeżeli węzeł zawiera węzły potomne to wartość ta zawiera także ich tekst; <xsl:template match= audycja"> <xsl:value-of select="."/> Dobranocka <xsl:template match="program"> <xsl:value-of select="."/> Dobranocka Dziennik Film Dobranocka 30 Film Dziennik Teleturniej Film Serial Teleturniej Film Teleturniej Dziennik Film
Wstawianie wartości atrybutów - HTML <xsl:template match="/"> <HTML> <HEAD> <TITLE>Kantorek</TITLE> </HEAD> <BODY bgcolor=" <xsl:value-of select= kantor/@kolor > > <BODY bgcolor="{kantor/@kolor}"> Kantorek! <br/> <xsl:value-of select="kantor/notowanie/data"/> </BODY> <HTML> </HTML> <HEAD> <TITLE>Kantorek</TITLE> </HEAD> <BODY bgcolor="magenta"> Kantorek! <br> </HTML> 11 03 2004 </BODY> 31
Tworzenie tabeli <xsl:template match="/"> <HTML> <BODY bgcolor="{kantor/@kolor}"> Kantorek! <br/> <table border="1"> <tr> <th>data</th><th>dolar</th><th>funt</th> <th>euro</th><th>hrywna</th><th>korona</th></tr> <xsl:apply-templates/> </table> </BODY> </HTML> <xsl:template match="notowanie"> <tr align="center"> <td><xsl:value-of select="data"/></td> <td><xsl:value-of select="kursy/dolar"/></td> <td><xsl:value-of select="kursy/funt"/></td> <td><xsl:value-of select="kursy/euro"/></td> <td><xsl:value-of select="kursy/hrywna"/></td> <td><xsl:value-of select="kursy/korona"/></td> </tr> <HTML> <BODY bgcolor="magenta"> Kantorek! <br> <table border="1"> <tr> <th>data</th> <th>dolar</th> <th>funt</th> <th>euro</th> <th>hrywna</th> <th>korona</th></tr> <tr align="center"> <td> 11 02 2003 </td> <td>3.79</td> <td>5.99</td> <td>4.22</td> <td>0.55</td> <td>0.88</td> </tr>... </table></body></html> 32
Tworzenie tabeli <xsl:template match="/">... <BODY bgcolor="{kantor/@kolor}"> Kantorek! <br/> <table border="1"> <tr> <th>data</th><th>dolar</th><th>funt</th> <th>euro</th><th>hrywna</th><th>korona</th></tr> <xsl:for-each select="kantor/notowanie"> <tr align="center"> <td><xsl:value-of select="data"/></td> <td><xsl:value-of select="kursy/dolar"/></td> <td><xsl:value-of select="kursy/funt"/></td> <td><xsl:value-of select="kursy/euro"/></td> <td><xsl:value-of select="kursy/hrywna"/></td> <td><xsl:value-of select="kursy/korona"/></td> </tr> </xsl:for-each> </table> </BODY> </HTML> <HTML> <BODY bgcolor="magenta"> Kantorek! <br> <table border="1"> <tr> <th>data</th> <th>dolar</th> <th>funt</th> <th>euro</th> <th>hrywna</th> <th>korona</th></tr> <tr align="center"> <td> 11 02 2003 </td> <td>3.79</td> <td>5.99</td> <td>4.22</td> <td>0.55</td> <td>0.88</td> </tr>... </table></body></html> 33
xsl:for-each deklaracja <xsl:for-each select= ścieżka >... </xsl:for-each> Instrukcja pętli w języku xsl Dla każdego elementu określonego atrybutem select wykonaj określone kroki <xsl:for-each select="kantor/notowanie"> Dla każdego elementu notowanie wykonaj... 34
<xsl:template match="/program"> <xsl:call-template name="naglowek"/> <xsl:apply-templates/> <xsl:call-template name="stopka"/> <xsl:template match="kanal"> <table border="1" width="300"> <tr><td> <xsl:apply-templates/> </td></tr> </table> <xsl:template match="audycja"> <xsl:apply-templates/> <xsl:template name="naglowek"> <br/> Program telewizyjny - wybrane audycje <br/> <xsl:template name="stopka"> <br/> Kolejne audycje za tydzień <br/> 35
<xsl:template match="/program"> <xsl:call-template name="naglowek"/> <xsl:apply-templates/> <xsl:call-template name="stopka"/> <xsl:template match="kanal"> <table border="1" width="300 ><tr><td> <xsl:apply-templates/> </td></tr></table> <xsl:template match="audycja"> <table border="1" width="100%"> <tr> <td width="60"><xsl:value-of select="../@nazwa"/></td> <td width="60"><xsl:value-of select="@osoba"/></td> <td width="80"><xsl:value-of select="text()"/></td> <td width="50"><xsl:value-of select="@data"/></td> <td width="40"><xsl:value-of select="@godz"/></td> <td width="30"><xsl:value-of select="@czas"/></td> </tr> </table> <xsl:template name="naglowek"> <br/> Program telewizyjny - wybrane audycje <xsl:template name="stopka"> 36 <br/> Kolejne audycje za tydzień
Instrukcja warunkowa <xsl:if test= wyrażenie logiczne >... <xsl:for-each select="kantor/notowanie"> <xsl:if test="data/rok>2003">... </xsl:if> </xsl:for-each>... </xsl:if>... <xsl:for-each select="kantor/notowanie"> <xsl:if test= kursy/funt>5.97">... </xsl:if> </xsl:for-each> 37
Instrukcja wyboru <xsl:choose> <xsl:when test= warunek">... </xsl:when> <xsl:otherwise>... </xsl:otherwise> </xsl:choose> <xsl:for-each select="kantor/notowanie"> <xsl:choose> <xsl:when test="kursy/funt>5.97">... </xsl:when> <xsl:otherwise>... </xsl:otherwise> </xsl:choose> </xsl:for-each> 38
<xsl:template match="kanal"> <table border="1 ><tr><td> <xsl:apply-templates/> </td></tr></table> <xsl:template match="audycja"> <xsl:if test="@czas>30"> <table border="1" width="100% ><tr> <td width="60"><xsl:value-of select="../@nazwa"/></td> <td width="60"><xsl:value-of select="@osoba"/></td> <td width="30"><xsl:value-of select="@czas"/></td> </tr></table> </xsl:if> <xsl:template match="kanal"> <table border="1 ><tr><td> <xsl:apply-templates select="audycja[@czas>30]"/> </td></tr></table> <xsl:template match="audycja"> <table border="1" width="100% ><tr> <td width="60"><xsl:value-of select="../@nazwa"/></td> <td width="60"><xsl:value-of select="@osoba"/></td> <td width="30"><xsl:value-of select="@czas"/></td> </tr></table> 39
Sortowanie węzłów <xsl:sort/> Atrybuty: select określenie nazwy węzła wg którego sortować; order descending lub ascending kolejność sortowania; data-type text lub number sortowanie alfabetyczne lub numerycznie <xsl:sort> może się pojawić wyłącznie w ciele elementu apply-templates albo wewnątrz instrukcji xsl:for-each. <xsl:for-each select="kantor/notowanie"> <xsl:sort select="data/rok" data-type="number"/> <xsl:for-each select="kantor/notowanie"> <xsl:sort select="data/rok" data-type="number"/> <xsl:sort select="data/miesiac" data-type="number"/> 40
<xsl:template match="kanal"> <table border= 1 ><tr><td> <xsl:apply-templates> <xsl:sort select="@osoba"/> </xsl:apply-templates> </td></tr></table> <xsl:template match="audycja"> <table border="1" width="100% ><tr> <td width="60"><xsl:value-of select="../@nazwa"/></td> <td width="60"><xsl:value-of select="@osoba"/></td> <td width="80"><xsl:value-of select="text()"/></td> <td width="50"><xsl:value-of select="@data"/></td> <td width="40"><xsl:value-of select="@godz"/></td> <td width="30"><xsl:value-of select="@czas"/></td> </tr></table> 41
Tworzenie linków (<a>) Wprowadzamy atrybut id dla elementu <notowanie id="1"> Tworzymy link <xsl:for-each select="kantor/notowanie"> <a href="#{@id}"><xsl:value-of select="data"/></a> <br/> </xsl:for-each> Tworzymy miejsce linku <xsl:for-each select="kantor/notowanie"> <a name="{@id}">... </a> </xsl:for-each> <a href="#id">tu kliknij</a>< a name= id"></a> 42
Numerowanie elementów Funkcja position() <xsl:for-each select="kantor/notowanie"> <tr align="center"> <td><xsl:number value="position()" format="1"/></td> <td><xsl:value-of select="data"/></td>... <xsl:number/> atrybuty: value wartość wyprowadzana format= 1 : 1, 2, 3, format= 01 : 01, 02, 03, format= A : A, B, C, format= a : a, b, c, format= I : I, II, III, format= i : i, ii, iii,... 43
Przykłady innych funkcji Obliczenie średniej ceny kursu dolara: <xsl:value-of select="sum(//dolar) div count(//dolar)"/> Obliczenie średniej ceny kursu dolara w 2004r.: <xsl:value-of select="sum(//dolar[../../data/rok=2004]) div count(//dolar[../../data/rok=2004])"/> Zaokrąglanie wyniku round(): <xsl:value-of select="round(sum(//dolar[../../data/rok=2004]) div count(//dolar[../../data/rok=2004])) 44
xsl:attribute Pozwala dołączyć atrybut do elementu wymienionego wcześniej. Deklaracja: <xsl:attribute name= nazwa">wartość</xsl:attribute> Przykład: <tr align="center"> <xsl:if test="position() mod 2 =0"> <xsl:attribute name="bgcolor">lime</xsl:attribute> </xsl:if>... 45