English | Français | Deutsch | Magyar | 中文 | >> Polski << ZVON > Tutorials > XSLT Tutorial
>> Zawartość << | Indeks elementu

Wstęp

Strona 1 Przy użyciu XSL można modyfikować dowolny tekst. arkusz stylów oraz arkusz stylów używają tego samego pliku źródłowego lecz dają różne wyniki.
Strona 2 Każdy arkusz stylów XSL musi zaczynać się elementem xsl:stylesheet. Atrybut version='1.0' określa wersję specyfikacji XSL(T). Przykład ten pokazuje najprostszy możliwy arkusz stylów. Nie zawiera on żadnej informacji więc użyte zostają domyślne reguły przetwarzania.
Strona 3 Procesor XSL przegląda źródło pliku XML próbując dopasować któryś z szablonów. Gdy to się uda wykonywane są instrukcje wewnątrz tego szablonu.
Strona 4 Zawartość oryginalnego elementu można uzyskać z źródła na dwa sposoby. arkusz stylów używa konstrukcji xsl:value-of. W tym przypadku zawartość elementu użyta zostaje bez żadnego dodatkowego przetwarzania. Instrukcja xsl:apply-templates użyta przez arkusz stylów działa inaczej. Parser przetwarza wybrane elementy, dla których zdefiniowano szablony.

Szablony

Strona 5 Procesor XSL przegląda źródło pliku XML próbując dopasować któryś z szablonów. Gdy to się uda wykonywane są instrukcje wewnątrz tego szablonu.
Strona 6 Część dokumentu do których odwołuje się szablon określany jest przez ścieżkę lokalizacji. Jej składnię określa specyfikacja XPath. Najprostsze przykłady przypominają adresowanie plików w strukturze katalogów. ( arkusz stylów )
Strona 7 Przetwarzanie zawsze zaczyna się od szablonu określonego przez atrybut match="/" . Taki szablon pasuje do głównego węzła (jedynego dziecka elementu dokumentu, w rozpatrywanym przypadku "source"). Wiele szablonów stylów nie zawiera tego szablonu wprost. W takim przypadku używany jest szablon domyślny, zawierający tylko jedną instrukcję: . Instrukcja ta nakazuje: przetwarzaj wszystkie dzieci dla tego węzła, włączając w to węzły tekstowe. Dla porównania: arkusz stylów i arkusz stylów . Gdy szablon dla węzła istnieje, domyślny nie zostanie użyty ( arkusz stylów ). Chcąc dołączyć potomków węzła, należy wprost zażądać ich szablonów ( arkusz stylów ).
Strona 8 Wiele ścieżek może być połączonych razem przez "|". Szablon stosowany jest wtedy do elementów wybranych przez dowolną z tych ścieżek ( arkusz stylów ). Maska "*" wybiera wszystkie elementy. Różnicę obrazuje porównanie arkusz stylów i arkusz stylów .
Strona 9 Bardzo częstym elementem występującym w ścieżce jest "//". Użyte na początku ścieżki znaczy: wybierz wszystkie węzły w dokumencie o podanym typie ( arkusz stylów ). Występując w środku ścieżki, ma znaczenie: wybierz wszystkie węzły w dokumencie pojawiąjące się wewnątrz węzła wybranego przez początek ścieżki ( arkusz stylów ).
Strona 10 Używając atrybutu mode można określić kilka równoległych trybów przetwarzania, z których każdy produkuje inny rezultat. arkusz stylów pokazuje przypadek gdy jeden z trybów nie istnieje.
Strona 11 Często zdarza się, że kilka szablonów pasuje do jednego elementu w źródłowym dokumencie. Konflikt, który z nich powinien być użyty, musi być wtedy rozwiązany. Atrybut priority może wskazywać wprost kolejność wyboru szablonów, lecz gdy nie jest podany, kolejność ustalana jest niejawnie przy użyciu kilku reguł. arkusz stylów oraz arkusz stylów różnią się priorytetem swoich szablonów. arkusz stylów pokazuje domyślną akcję w przypadku braku atrybutów priority. Szablon CCC ma niższy priorytet niż CCC/CCC, gdyż ma szerszy zakres (jest mniej specyficzny). Dla porównania: arkusz stylów oraz arkusz stylów . W ich przypadku szablon CCC ma niższy priorytet zarówno od CCC/CCC jak i AAA/CCC/CCC, lecz dwa ostatnie mają równy priorytet. W takim przypadku procesor XSLT może sygnalizować błąd lub też może wybrać wśród szablonów o tym samym priorytecie - ostatni. arkusz stylów : szablon mniej specyficzny "*" ma niższy priorytet niż CCC. Obliczone priorytety zmieniają się od -0.5 do 0.5. Specyfikacja XSLT podaje w tym temacie więcej szczegółów.

Atrybuty

Strona 12 Do atrybutów odwoływać się można w podobny sposób jak do elementów. Istotne jest "@" na początku nazwy.
Strona 13 Atrybuty można przetwarzać w ten sam sposób jak elementy.
Strona 14 Warunkiem wyboru elementów może być również obecność lub brak danego atrybutu. arkusz stylów zawiera, a arkusz stylów wyłącza elementy, jeśli określony atrybut jest obecny.

Osie

Strona 15 Osie odgrywają ważną rolę w XSLT. Więcej szczegółów znaleźć można w słowniku pojęć dotyczących XSLT. Do porównania: oś child ( arkusz stylów ), oś descendant ( arkusz stylów ), oś parent ( arkusz stylów ), oś ancestor ( arkusz stylów ), oś following-sibling ( arkusz stylów ), oś preceding-sibling ( arkusz stylów ), oś following ( arkusz stylów ), oś preceding ( arkusz stylów ), oś attribute ( arkusz stylów ), oś namespace ( arkusz stylów ), oś self ( arkusz stylów ), oś descendant-or-self ( arkusz stylów ), oś ancestor-or-self ( arkusz stylów ).
Strona 16 W tym przykładzie użyto wszystkich dostępnych osi.
Strona 17 Oś child:: jest domyślna i może być pominięta. Oś attribute:: może być skrócona do postaci @ . Oś descendant-or-self:: może być przedstawiona jako // , self:: jako . natomiast .. może być użyte w miejsce osi parent::.

Powtórzenia i sortowanie

Strona 18 Instrukcja xsl:for-each zawiera w sobie szablon, który jest stosowany do każdego węzła wybranego przez atrybut select.
Strona 19 Węzły wybrane przez xsl:for-each ( arkusz stylów i arkusz stylów ) lub xsl:apply-templates ( arkusz stylów ) mogą być sortowane. Kolejność sortowania jest określona przez atrybut "order". arkusz stylów sortuje w kolejności rosnącej, a arkusz stylów w malejącej.
Strona 20 arkusz stylów sortuje tekst, a arkusz stylów sortuje według wartości numerycznej. Należy zauważyć istotną różnicę: znak '2' jest w alfabetycznym porządku za znakiem '1', tak więc "2" występuje za "10" przy sortowaniu tekstowym.
Strona 21 arkusz stylów sortuje umieszczając wielkie litery na początku. arkusz stylów umieszcza na początku małe litery.

Tworzenie elementów i atrybutów

Strona 22 xsl:element tworzy elementy w trakcie przetwarzania. arkusz stylów pokazuje sposób użycia, podczas gdy arkusz stylów uzyskuje ten sam efekt używając jednak bardziej zawiłej metody.
Strona 23 xsl:attribute tworzy element w trakcie przetwarzania. Tworzy atrybuty dla elementu wewnątrz którego został zadeklarowany.
Strona 24 Konstrukcje copy oraz copy-of są używane do kopiowania węzłów. Copy kopiuje wyłącznie bieżący węzeł, bez dzieci ani atrybutów. Copy-of kopiuje wszystko.
Strona 25 Element xsl:copy może zawierać atrybut use-attiribute-sets, w którym można określić atrybuty dla kopiowanych elementów. arkusz stylów nie daje spodziewanych rezultatów (use-attribute-sets z funkcją name) ponieważ wyrażenia atrybutów, które odnoszą się do nazwanych obiektów XSLT nie są obliczane.

Przetwarzanie warunkowe

Strona 26 Instrukcja xsl:if umożliwia przetwarzanie warunkowe. arkusz stylów demonstruje typowy przykład użycia xsl:for-each, dodający tekst między poszczególne pozycje. Bardzo często niewskazane jest umieszczanie takiego tekstu za ostatnią pozycją, wtedy pomocne będzie użycie xsl-if ( arkusz stylów )
Strona 27 Elementu xsl:choose używa się w sytuacji wyboru jednej z kilku możliwości.
Strona 28 Sposób na określenie czy dany tekst zaczyna się liczbą.

Generowanie i formatowanie liczb

Strona 29 arkusz stylów demonstruje domyślne zachowanie elementu xsl:number . Numerowanie rozdziałów zależy od pozycji - każdy z poziomów jest numerowany niezależnie. Atrybut level z wartością multiple, tak jak to pokazuje arkusz stylów , umożliwia bardziej naturalną numerację.
Strona 30 xsl:number wstawia sformatowany numer. Format jest określny w przez atrybut "format". Wartość atrybutu rozpoczyna się identyfikatorem formatu po których umieszczone są znaki separacji. Kolejne przykłady ilustrują tę notację.
Strona 31 arkusz stylów oraz arkusz stylów podają przykłady formatowania wielopoziomowych numerów.

Zmienne

Strona 32 arkusz stylów oraz arkusz stylów pokazują różne sposoby przypisania wartości do xsl:variable, a arkusz stylów i arkusz stylów - przypisania do xsl:param.
Strona 33 Arkusz stylów może zawierać zmienne o tej samej nazwie. arkusz stylów pokazuje sposób na uzyskanie wartości zmiennej globalnej o nazwie identycznej jak lokalna. arkusz stylów pokazuje błędny sposób. Wartość lokalnej zmiennej jest przypisana do elementu xsl:when. Poza nim, obowiązuje zatem globalna zmienna.
Strona 34 Parametry dla szablonu mogą być przekazywane przy użyciu elementu xsl:with-param. Jeśli szablon zawiera element xsl:param z tą samą nazwą jak nazwa atrybutu xsl:with-param, to jego wartość jest użyta. arkusz stylów pokazuje typowy przykład. Jeśli istnieje konieczność przekazania zmiennej, należy zdefiniować ją przy użyciu elementu xsl:param. arkusz stylów pokazuje błędną próbę rozwiązania tego problemu.
Strona 35 Zmienna może przechowywać jako swoją wartość fragment drzewa wynikowego. Operacje dozwolone na fragmencie drzewa wynikowego są podzbiorem tych, których użyć można na zbiorze węzłów. Dana operacja jest dozwolona na fragmencie drzewa wtedy gdy operacja tej można byłoby użyć na łańcuchu znaków (z ewentualną, wstępną konwersją łańcucha znaków do liczby lub wartości logicznej). W szczególności, na fragmencie drzewa wynikowego, nie jest dozwolone użycie operatorów: /, // i []. Gdy operacja wykonywana jest na danym framencie drzewa wynikowego, jest wykonywana dokładnie tak jak byłaby wykonywna na odpowiadającym jej zbiorze węzłów. Dla porównania: arkusz stylów oraz arkusz stylów .
Strona 36 Przykład ilustruje ważną różnicę w określaniu wartości zmiennej.

Obliczenia numeryczne

Strona 37 Funkcja number() przekształca swój argument do postaci typu numerycznego. arkusz stylów demonstruje konwersję łańcucha znaków, arkusz stylów - konwersję wartości logicznych: true i false (prawda i fałsz).
Strona 38 Dodawanie, odejmowanie i mnożenie używają zwyczajowej składni ( arkusz stylów ). Natomiast składnia dzielenia różni się nieco od powszechnie przyjętej. Ukośnik "/" ma już przypisaną funkcję we wzorcach, dlatego też operatorem dzielenia jest słowo kluczowe div ( arkusz stylów ). Dopełniającym operatorem jest mod , który zwraca resztę z dzielenia całkowitoliczbowego ( arkusz stylów ).
Strona 39 Funkcja sum() sumuje wszystkie numery w wybranych węzłach. arkusz stylów sumuje wszystkie numery, a arkusz stylów tylko nieparzyste.
Strona 40 Funkcje ceiling(), floor() i round() konwertują liczbę zmiennoprzecinkową do całkowitej.
Strona 41 Funkcja string() przekształca swój argument do łańcucha znaków. W większości przypadków nie ma potrzeby używać jej wprost, gdyż wywoływana jest w sposób niejawny. arkusz stylów pokazuje przykład konwersji wartości numerycznej do łańcucha znaków. Szczególną uwagę należy zwrócić na rezultat dzielenia przez zero.
Strona 42 Test sprawdzający, czy wartość elementu reprezentuje liczbę.

Funkcje logiczne

Strona 43 arkusz stylów pokazuje przykład, w którym łańcuchy znaków są argumentami funkcji boolean(). Łańcuch taki ma wartość logiczną true (prawda) wtedy i tylko wtedy gdy jego długość jest różna od zera. arkusz stylów demonstruje tekst przekształcony do typu liczbowego, wtedy użyty jako argument funkcji boolean(). arkusz stylów porównuje "0" jako łańcuch znaków oraz jako typ liczbowy. arkusz stylów używa zbiorów węzłów jako argumentów funkcji boolean().
Strona 44 Funkcja not zwraca wartość logiczną true (prawda) jeżeli jej argument ma wartość logiczną false (fałsz), lub false - w przeciwnym przypadku.
Strona 45 funkcje true() oraz false() są użyteczne gdy w trakcie programowania zachodzi potrzeba przetestowania pewnych warunków.
Strona 46 Funkcja lang() zwraca wartość true lub false zależnie czy język węzła kontekstowego określonego przez atrybut xml:lang jest taki sam bądź też jest podjęzykiem języka określonego w argumencie. Język w kontekście danego węzła jest określony przez bezpośrednie użycie atrybutu xml:lang, a w przypadku jego braku - przez najbliższego przodka tego węzła, który taki atrybut posiada. W przypadku gdy żaden z przodków nie posiada atrybutu xsl:lang, funkcja lang() zwraca wartość false. Gdy atrybut zostanie odnaleziony, porównywana jest jego wartość z argumentem funkcji, przy czym ignorowana jest wielkość liter oraz pomijany jest ewentualny (dowolny) przyrostek w wartości atrybutu.

Funkcje operujące na łańcuchach znaków

Strona 47 Funkcja string() przekształca swój argument do łańcucha znaków. W większości przypadków nie ma potrzeby używać jej wprost, gdyż wywoływana jest w sposób niejawny. arkusz stylów pokazuje przykład konwersji wartości numerycznej do łańcucha znaków. Szczególną uwagę należy zwrócić na rezultat dzielenia przez zero.
Strona 48 Funkcja concat() zwraca konkatenację (złączenie) swoich argumentów.
Strona 49 Funkcja starts-with() zwraca wartość logiczną true (prawda) wtedy gdy łańcuch znaków z pierwszego argumentu zaczyna się tak jak łańcuch znaków jej drugiego argumentu. Funkcja contains() zwraca wartość true jeśli łańcuch znaków z pierwszego argumentu zawiera łańcuch znaków z argumentu drugiego. W każdym innym przypadku od wymienionych, obie funkcje zwracają wartość logiczną false (fałsz).
Strona 50 Funkcja substring-before() zwraca fragment łańcucha znaków danego w pierwszym argumencie, takiego że poprzedza on pierwsze wystąpienie łańcucha znaków danego w drugim argumencie. Działanie funkcji substring-after() jest analogiczne, lecz w tym przypadku wybierany jest fragment łańcucha znaków występujący po pierwszym wystąpieniu. Funkcja substring() zwraca fragment łańcucha znaków pierwszego argumentu, zaczynając od pozycji określonej w drugim argumencie i długości danej w trzecim. Jeśli trzeci argument nie jest podany, zwracany jest fragment łańcuch do końca łańcucha źródłowego. Znaki w łańcuchu numerowane są od 1. ( arkusz stylów ). arkusz stylów demonstruje przypadek, kiedy wartości argumentów wykraczają poza zakres łańcucha lub gdy nie są liczbami całkowitymi. Zwracany fragment łańcucha znaków zawiera te znaki, dla których pozycja znaków jest większa lub równa drugiemu argumentowi oraz gdy trzeci argument jest podany - pozycja ta musi być mniejsza niż suma drugiego i trzeciego argumentu.
Strona 51 Funkcja string-length() zwraca liczbę znaków w łańcuchu. Funkcja normalize-space() zwraca swój argument po znormalizowaniu białych znaków, czyli - usunięciu wszystkich początkowych i końcowych białych znaków oraz przez zastąpienie każdej ich sekwencji wewnątrz jedną spacją.
Strona 52 Rezultatem działania funkcji translate() jest łańuch znaków uzyskany następująco: w łańcuchu znaków z pierwszego argumentu zamieniane są wszystkie wystąpienia znaków z drugiego argumentu na odpowiadające im (według pozycji) znaki trzeciego argumentu. Jeżeli znak występuje więcej niż raz w drugim argumencie, wtedy brane pod uwagę jest pierwsze wystąpienie. Jeżeli trzeci argument jest dłuższy niż drugi, to nadmiarowe znaki są ignorowane.

Funkcje operujące na zbiorach węzłów

Strona 53 Funkcja position() zwraca liczbę równą pozycji kontekstu w którym została wywołana, natomiast funkcja last() zwraca liczbę równą wielkości kontekstu. arkusz stylów demonstruje użycie tych funkcji w kilku kontekstach. arkusz stylów porównuje posortowany i nie posortowany element xsl:for-each.
Strona 54 Funkcja count() zwraca liczbę węzłów w zbiorze podanym jako argument.
Strona 55 Funkcja id() wybiera elementy według ich unikalnego ID. arkusz stylów demonstruje proste przykłady użycia. Dokładnego przestudiowania wymaga arkusz stylów . Zawartość elementu title nie jest wyświetlana w nawiasach kwadratowych "[]" gdyż w DTD jego atrybut id jest zdefiniowany nie jako ID, lecz jako CDATA. Jednocześnie może być podanych wiele ID ( arkusz stylów ).
Strona 56 Przykład użycia funkcji id().
Strona 57 Funkcje: name, local-name oraz namespace-uri() można użyć by otrzymać informację o nazwie elementu lub atrybuta oraz ich przestrzeniach nazw.

Dane wyjściowe

Strona 58 Element xsl:output umożliwia arkuszowi stylów na określenie ostatecznego formatu generowanego dokumentu. Procesor XSLT powinien stosować się do wskazówek umieszczonych w xsl:output, nie jest jednak do tego obligowany. Element xsl:output może wystąpić tylko jako element najwyższego poziomu. arkusz stylów używa html jako formatu wyjściowego, a arkusz stylów - xml. Szczególną uwagę zwrócić należy na różnice w sposobie zapisu pustych znaczników.
Strona 59 W przypadku braku elementu xml:output domyślną metodą zapisu jest xml ( arkusz stylów ). Gdy element główny dokumentu wyjściowego ma wartość html (wielkość liter dowolna) oraz nie posiada atrybutu 'xmlns', to wtedy do sapizu użyta zostaje metoda html ( arkusz stylów ).
Strona 60 Metoda zapisu html nie powinna zapisywać znaczników końca dla pustych elementów (wg specyfikacji HTML). Nie powinna też zmieniać treści wewnątrz elementów script oraz style (jak demonstruje to źródło najniższego okna pośrodku, oglądane w przeglądarce). Można porównać: arkusz stylów ; natomiast po więcej szczegółów sięgnąć należy do specyfikacji XSLT.
Strona 61 Przy użyciu atrybutu encoding można określić preferencję dla używanego kodowania. Metoda zapisu html powinna dodać element META określający użyte kodowanie znaków, zaraz za początkowym znacznikiem elementu HEAD. arkusz stylów używa kodowania UTF-8 dla danych wyjściowych, arkusz stylów - UTF-16, a arkusz stylów - Cp1250. arkusz stylów - należy obejrzeć źródło najniższego, środkowego okna w przeglądarce. Źródło xml zawiera znaki, które nie są dostępne w danym kodowaniu, dlatego też muszą zostać eskejpowane.
Strona 62 Metoda wyjściowa text buduje drzewo wynikowe przez przepisanie wprost wartości łańcuchów tekstowych dla każdego węzła tekstowego w źródłowym dokumencie, według kolejności ich występowania. Aby obejrzeć przykład, należy odwołać się do źródła dokumentu w przeglądarce.

Kopiowanie

Strona 63 Konstrukcje copy oraz copy-of są używane do kopiowania węzłów. Copy kopiuje wyłącznie bieżący węzeł, bez dzieci ani atrybutów. Copy-of kopiuje wszystko.
Strona 64 Element xsl:copy może zawierać atrybut use-attiribute-sets, w którym można określić atrybuty dla kopiowanych elementów. arkusz stylów nie daje spodziewanych rezultatów (use-attribute-sets z funkcją name) ponieważ wyrażenia atrybutów, które odnoszą się do nazwanych obiektów XSLT nie są obliczane.

Inne funkcje

Strona 65 Funkcja current() zwraca zbiór węzłów zawierający bieżący węzeł jako jego jedyny element. Dla najbardziej zewnętrznego wyrażenia (wyrażenia nie występującego wewnątrz innego wyrażenia), węzeł bieżący to zawsze węzeł kontekstu. Pomiędzy nawiasami kwadratowymi węzeł bieżący jest zazwyczaj różny od węzła kontekstu.
Strona 66 Funkcja generate-id() tworzy identyfikator zgodny z specyfikacją XML. arkusz stylów używa tej funkcji by dodać identyfikator do wszystkich elementów w źródłowym pliku XML.

Łączenie arkuszy stylów

Strona 67 Zewnętrzne arkusze stylów można importować (xsl:import) lub włączać (xsl:include). Obie te operacje działają podobnie, lecz w definicje i szablony definiowane w importującym arkuszu stylów mają pierszeństwo przed tymi z importowanego (lub włączanego przy użyciu xsl:include). arkusz stylów oraz arkusz stylów są importowane lub włączane do pozostałych arkuszy stylów.
Strona 68 arkusz stylów importuje arkusz stylów , a arkusz stylów importuje arkusz stylów .
Strona 69 Inne przykłady użycia xsl:include oraz xsl:import.
Strona 70 Element xsl:apply-imports może być użyty by uzyskać informację z importowanego szablonu, gdy jego zachowanie zmienia się. arkusz stylów importuje arkusz stylów oraz nadpisuje jego szablony. arkusz stylów importuje arkusz stylów oraz zmienia jego szablony. xsl-apply-imports działa tylko w przypadku importowania przy użyciu xsl:import, nie zadziała natomiast gdy użyto xsl:include ( arkusz stylów ).
Strona 71 Kolejność importowania jest ważniejsza niż kolejność ustawionych priorytetów. Przykład prezentuje arkusz stylów