1
Technologie Internetu
wykład 10: XSLT, XPointer, XLink
Piotr Habela
Polsko-Japońska Wyższa Szkoła
Technik Komputerowych
2
W poprzednim odcinku…
• XML Schema istotnie rozszerza możliwości DTD:
– Wszelkie ograniczenia z DTD wyrażalne w XML Schema;
– Znacznie bogatszy i rozszerzalny system typów;
– W połączeniu z ograniczeniami unikalności pozwala to na
bardziej precyzyjną kontrolę strukturalnej poprawności
dokumentu;
– XML Schema jest odrębną specyfikacją; brak zgodności „w
dół”;
• XPath:
– Język deklaratywny służący wskazywaniu elementów,
atrybutów, lub całych fragmentów dokumentu XML;
– Nie tylko adresowanie konkretnego miejsca: wyrażenia
kierunków – osie (axes) oraz predykaty pozwalają
selekcjonować pojedynczą ścieżką wiele miejsc, co nawiązuje
niejako do funkcjonalności języka zapytań;
– Potraktowanie dokumentu jako hierarchii węzłów wnosi
pewne ograniczenia.
3
Plan wykładu
• XPath – przypomnienie.
• XSL (eXtensible Stylesheet Language) -
wprowadzenie:
– Koncepcja transformacji XSL;
– Budowa wzorców XSLT;
– Środki programistyczne dostępne w XSLT.
• XPointer – rozszerzenie możliwości
XPath.
• XLink – budowa odnośników pomiędzy
zasobami.
4
XPath - przypomnienie
• Ścieżka sformułowana w języku XPath:
– Opiera się na tzw. osiach (axes): np. child, parent,
descentand-or-self itd., pozwalających z dowolnego
miejsca dokumentu nawigować do dowolnego
innego miejsca;
– Każdy krok ścieżki zawęża obszar poszukiwań;
– Może być globalna lub względna wobec aktualnego
kontekstu;
– Dla najważniejszych wyrażeń określono zapis
skrócony.
• Istnieje możliwość selekcjonowania elementów,
atrybutów, instrukcji przetwarzania czy
zawartości tekstowej.
5
Język XSL (eXtensible Stylesheet
Language)
6
XSL - charakterystyka
• Zakładane przez XML oczyszczenie informacji z
zawartości związanej z prezentacją pozostawia
otwartym problem wizualizacji takich dokumentów.
• W celu realizacji niezbędnych przekształceń powstał
język XSL (eXtensible Stylesheet Language). Swego
rodzaju protoplastą tego mechanizmu były
kaskadowe arkusze stylów (CSS), jednak realizacja
języka XSL jest odmienna.
• W ramach tego standardu powstały specyfikacje:
– XSLT (XSL Transformations);
– XSL FO (XSL Formating Objects);
• XSLT określany jako język o charakterze
deklaratywnym, oparty na regułach przekształceń
(rule-based). Język przekształceń drzew XML.
7
Koncepcja języka XSLT
• Scenariusze przetwarzania:
– zmiana struktury dokumentu XML;
– utworzenie arkusza XSLT do przetwarzania innych
dokumentów;
– obudowanie danych z pliku XML informacjami o sposobie
prezentacji.
• Przetwarzania dokumentów w oparciu o wzorce
służą programy określane jako procesory XSLT.
• XSLT – koncepcja realizacji przekształceń:
Dokument XML + Dokument XSLT => Dokument
wynikowy
• Użyteczność tego scenariusza dla wizualizacji
dokumentu XML wymaga, aby zawierał on odwołanie
do dokumentu XSLT:
<?xml version=”1.0” ?>
<?xml-stylesheet type=”text/xsl” href=”naszArkusz.xsl” ?>
8
Dokument wzorca XSLT
• Określa zakresy przeszukiwania; wskazania
zawartości do przetworzenia za pomocą XPath.
• Definiuje sposób przekształcenia poszczególnych
rodzajów wyszukanej zawartości.
• Budowa dokumentu:
– elementem-korzeniem jest xsl:stylesheet;
– przestrzeń nazwowa specyfikacji:
xmlns:xsl = ”http://www.w3.org/1999/XSL/Transform”;
– budowa znacznika otwierającego:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
• Z kolei element nie prefiksowany przestrzenią
xsl jest przekazywany bez interpretacji do
dokumentu wyjściowego. Tym sposobem można
np. aplikować znaczniki HTML.
9
Element szablonu (xsl:template)
• Przekształcenia są aplikowane w oparciu o element
xsl:template:
–
atrybut match tego elementu zawiera wzorzec (pattern)
zawartości, która ma być przetwarzana, przedstawiony w
języku XPath.
–
alternatywnie może zostać użyty atrybut name, zawierający
dowolną nazwę, służącą do uruchomienia danego szablonu
(template) poleceniem xsl:call-template;
–
wnetrze elementu xsl:template określa sposób
przetwarzania:
<xsl:template match=”//szukaneElementy”>
.. sposób przetwarzania ..
</xsl:template>
• Często pierwszy element xsl:template odwołuje się
do całego dokumentu (tj. używa match=”/”) i zawiera
wywołania innych, zdefiniowanych dalej szablonów.
10
Konstruowanie dokumentu wynikowego (1)
• Reguły transformacji umożliwiają wstawianie do
dokumentu wynikowego wartości z dokumentu
źródłowego, wyselekcjonowanej wyrażeniem XPath.
• Służy temu element xsl:value-of, z atrybutem select,
zawierającym wyrażenie XPath.
• Można również wstawiać wyniki obliczeń, tj. rezultaty
funkcji wywołanych w kontekście wyrażenia XPath. Np.
stosując funkcję count(node-set), zwracamy tu syntetyczne
dane w postaci liczby książek ocenionych na 3,5 oraz na 4.
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<p>Review of 3.5 = <xsl:value-of
select="count(books/book[review=3.5])"/></p>
<p>Review of 4 = <xsl:value-of
select="count(books/book[review=4])"/></p>
</xsl:template>
</xsl:stylesheet>
11
Konstruowanie dokumentu wynikowego (2)
• Przewidziano możliwość numerowania wyprowadzanych
danych:
<xsl:number value="position()"/>
• Kolejnym kluczowym elementem występującym zwykle
wewnątrz głównego wzorca jest zastosowanie wzorców do
wyselekcjonowanej zawartości:
<xsl:apply-templates />
• Atrybut select określa lokalizacje, do których mają zostać
zastosowane zdefiniowane w arkuszu szablony. Brak tego
atrybutu spowoduje zastosowanie szablonów do elementów
zawartych bezpośrednio w elemencie stanowiącym bieżący
kontekst.
• Umieszczenie tego polecenia w powyższej postaci (bez
atrybutu) we wszystkich wprowadzonych wzorcach pozwala na
„bezkontekstowe” przetworzenie zawartości w zależności od
rodzaju elementu.
• Np. <xsl:template match="tytul">
<p><font face="verdana" color="steelblue" size="3">
<xsl:apply-templates />
</font> </p> </xsl:template>
12
Przekazywanie zawartości bez
przetwarzania
• Chcąc uniknąć przetwarzania zawartości
elementów danego rodzaju, możemy zamiast
<xsl:apply-templates /> zastosować: <xsl:value-of
select=”.” /> celem wyprowadzenia samej
(nieprzetworzonej) zawartości (bez znaczników)
albo: <xsl:value-of select=”./text()” /> dla
zwrócenia tylko bezpośrednio zawartego tekstu.
• Efektywnie, obok instrukcji value-of, apply-
templates oraz bezpośredniego wpisywania
zawartości do wzorca, do budowania zawartości
elementu docelowego można użyć jeszcze:
– <xsl:copy> - umieszczenie wskazanego elementu w
całości w strukturze wynikowej;
– <xsl:copy-of>- umieszczenie wskazanego elementu w
całości w strukturze wynikowej wraz z jego przodkami i
atrybutami.
13
Instrukcja pętli oraz instrukcja warunkowa
• Kolejne przetworzenie wszystkich
wyselekcjonowanych elementów możemy uzyskać
stosując instrukcję
<xsl:for-each select=”sciezka” />
. Np.
<xsl:for-each select="lista/osoba">
… </xsl:for-each>
• Umożliwia to przetwarzanie o charakterze
proceduralnym, niezbędne w sytuacjach, gdy np.
trzeba zreorganizować układ elementów w
dokumencie docelowym.
• Instrukcja warunkowa xsl:if: jej zawartość jest
przetwarzana, jeśli wyrażenie w atrybucie test
zwróci:
– niepusty zbiór węzłów;
– niepusty łańcuch tekstowy;
– lub liczbę różną od zera.
• Składnia:
<xsl:if test=”wyrażenie logiczne”>
.. Zawartość warunkowa .. </xsl:if>
14
Instrukcja wielokrotnego wyboru
• Uzupełnia funkcjonalność instrukcji if (która nie
posiada segmentu else).
• Oparta na elemencie xsl:choose.
• Układ instrukcji znany z Javy (instrukcja switch):
<xsl:choose>
<xsl:when test=”warunek”>
zawartość jeśli spełniony
</xsl:when>
…
<xsl:otherwise>
zawartość gdy żaden z powyższych nie spełniony
</xsl:otherwise>
</xsl:choose>
15
Wstawianie atrybutów oraz sortowanie
• Wstawianie atrybutu do elementu wyjściowego:
<naszEl> <xsl:attribute name=„nazwaAtr"> <xsl:value-of
select="@istniejacyAtr" /> </xsl:attribute> </naszEl>
Jeżeli atrybut nie jest wstawiany w oparciu o instrukcję wyboru,
można użyć formy skróconej (tzw. attribute template). Np.
<img src="{@lokalizacjaPliku}" />
Ponadto można konstruować elementy <xsl:element>,
komentarze <xsl:comment> oraz instrukcje przetwarzania
<xsl:processing-instruction>
• Sortowanie zawartości:
– realizowane przy zastosowaniu elementu xsl:sort;
– element ten może się pojawić wyłącznie w ciele elementu
apply-templates albo wewnątrz instrukcji xsl:for-each.
– Posiada następującą deklarację, przy czym domyślnym typem
danych dla sortowania jest text:
<xsl:sort select = wyrażenie-string
data-type = { "text" | "number" | Qname }
order = { "ascending" | "descending" }
case-order = { "upper-first" | "lower-first" } lang = { kod języka } />
16
Zmienne w XSLT
• Zmienne deklaruje się przy użyciu elementu xsl:variable:
<xsl:variable
name = ”nazwa” select =”wyrażenie” </xsl:variable>
• Użyteczne dla wprowadzania powtarzających się danych
oraz dla zapamiętania określonego kontekstu.
• Mogą przechowywać zbiór węzłów albo łańcuch
tekstowy.
• Odwołania do tak zadeklarowanych zmiennych w innych
wyrażeniach select: poprzez poprzedzenie nazwy
zmiennej symbolem dolara „$”.
• Zmenna może być globalna (zadeklarowana ponad
deklaracjami szablonów) albo lokalna (zadeklarowana
wewnątrz danego szablonu).
• Podobne właściwości posiadają parametry:
<xsl:param>:
– Ograniczenia na miejsce występowania;
– instrukcje xsl:apply-templates oraz xsl:call-template mogą
przekazywać wartości do wzorców;
17
Wołanie funkcji ze skryptów
• Rozszerzenie dostarczane przez Microsoft
umożliwia wołanie funkcji napisanych w VBScript
lub JavaScript;
• Deklaracja funkcji wymaga zadeklarowania
odpowiedniej przestrzeni nazwowej:
<?xml version="1.0" ?>
<xsl:stylesheet
xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:naszeFunkcje="http://firma.com/przestrzenNazw"
version= "1.0">
• Deklaracja funkcji:
<msxsl:script language="VBScript" implements-
prefix=„naszeFunkcje">
<![CDATA[
tutaj kod funkcji ]]>
</msxsl:script>
• Wołanie funkcji:
<xsl:value-of select=„naszeFunkcje:xyz"/>
18
Wołanie nazwanych szablonów
• Szablony nazwane wraz z obsługą parametrów
dostarczają udogodnień programowania
proceduralnego:
• Można zdefiniować nazwany szablon wraz z
oczekiwanymi przezeń parametrami:
<xsl:template name="formatowanieZawartosci">
<xsl:param name="naszParametr"/>
Budowa struktury wynikowej w oparciu o
$naszParametr…
</xsl:template>
• Następnie wywołujemy wzorzec w odpowiednim
kontekście, przekazując parametry:
<xsl:for-each select="/naszDok/naszElement">
<xsl:call-template name="formatowanieZawartosci">
<xsl:with-param name="naszParametr" select="./*"/>
</xsl:call-template> </xsl:for-each>
19
Język XPointer
20
Język XPointer
• Stanowi rozszerzenie języka XPath.
• Uzupełnia system adresów URI używanych w
XLink (zob. dalej).
• Pozwala oznaczać i wskazywać fragmenty
dokumentów XML.
• Może traktować dokument zarówno jako drzewo
węzłów (jak XPath), lub jako ciąg znaków (w treści
elementów), pozwalając wskazywać jego podciągi.
• Wprowadza dwa specjalne typy wskaźników:
– punkt (point) w dokumencie XML;
– zakres (range) pomiędzy punktami końcowymi
(mogącymi się znajdować w różnych elementach);
• Rozróżnia się także (używając środków XPath)
węzły (node) i elementy (element).
21
Wskazania elementów dokumentu XML
• Odwołanie za pomocą identyfikatora: jeśli określony
element posiada atrybut typu ID, to można się doń
odwołać poprzez wartość tego identyfikatora:
xpointer(id(”a1234”)) albo z zewnątrz, następująco
konstruując URI:
http://firma.com/dokument.xml#a1234
• Obok tradycyjnego wskazywania poprzez nazwę,
stosuje się skróty XPath – tzw. sekwencję dzieci
(child sequence).
– Każdy krok ścieżki oznacza tu zejście o jeden poziom w
hierarchii węzłów i wybranie na danym poziomie n-tego
kolejnego podelementu.
– Np. xpointer(/*[1]/*[3]/*[2]) oznacza wybranie z elementu-
korzenia trzeciego z jego elementów potomnych, z tego
zaś drugiego z kolei jego elementu potomnego.
22
Pojęcie punktu i zakresu w XPointer
• XPointer wprowadza pojęcie punktu (point):
• Punkt początkowy (danego elementu)
umiejscowiony jest tuż po znaczniku początkowym:
xpointer(start-point(//sprawozdanie))
• Z kolei jeśli chcemy wskazać początek całego
dokumentu:
xpointer(start-point(/))
• Analogicznie, funkcja end-point(ścieżka) wskazuje
na punkt końcowy, tj. miejsce tuż przed
znacznikiem końcowym danego elementu;
• Zakres w oparciu o wytyczające go elementy:
xpointer(range(//uczelnia/wydzial[1])) -> obejmuje
fragment (lub fragmenty) dokumentu włącznie ze
znacznikami wyznaczającymi podane elementy.
• Punkty można wyznaczać też w oparciu o zakres:
xpointer(start-point(range(//uczelnia/wydzial[1])))
23
Zakresy w oparciu o zadany ciąg znaków
• Funkcja o sygnaturze:
string-range(location-set, string, number?, number?)
• Drugi z argumentów stanowi wzorzec
wyszukiwania.
• Np. xpointer(string-
range(//sprawozdanie/zakup,”oprogr”))
• Opcjonalne parametry liczbowe określają pierwszy
znak zakresu (względem miejsca odnalezienia
wzorca) oraz długość zakresu (domyślnie jest to
długość wzorca).
• Interesującą właściwością jest to, że dla spójnego
zbioru miejsc przeszukiwana zawartość tekstowa
traktowana jest jako ciągła, tj. z pominięciem
znaczników.
24
Zakres poprzez podanie miejsc początku i
końca
• Wykonana w odpowiednim kontekście funkcja
range-to(location-set) zwróci zakres
rozciągający się od kontekstu jej wywołania do
podanej jako parametr lokalizacji.
• Np. xpointer(id(
”sprawozd03”)/range-to(id(”sprawozd08”)))
• Wariantem tej funkcji jest
range-inside(location-set).
Różni się ona wykluczeniem z wynikowego
zakresu wyznaczających jego granice miejsc.
• Wszystkie wspomniane tu funkcje zwracają
rezultat typu „zbiór miejsc” (location-set).
25
Wskazania względne
• Funkcja here() pozwala na budowanie wskazań
względnych. Zwraca ona element, w którym
umieszczono dane wyrażenie XPointer.
• Np. xpointer(here()/../following::zamowienie[1])
umieszczone w podelemencie elementu
„zamowienie”, wskaże na następny element
„zamowienie”.
26
Język XLink
27
XLink - charakterystyka
• XLink (XML Linking Language) rozszerza
koncepcję odsyłaczy HTML. Zastosowanie języka:
łączenie dowolnych zasobów sieci Internet.
• Samodzielna specyfikacja (tj. nie objęta XML v.
1.0). Wymaga zatem zadeklarowania przestrzeni
nazwowej: http://www.w3.org/1999/xlink,
opatrywanej zwykle słowem kluczowym xlink.
• Pokonuje następujące ograniczenia odsyłaczy
HTML:
– brak możliwości oznaczenia charakteru odnośnika;
– mają charakter binarny (łączą jedynie pary
dokumentów: źródłowy i docelowy);
– są zawarte w dokumencie źródłowym (nie mogą być
przechowywane zewnętrznie);
– problemem jest aktualizacja;
– mogą wskazywać dokumenty lub punkty w
dokumentach, ale nie np. elementy dokumentu XML.
28
Odsyłacze proste XLink
• Rozszerzenie odsyłaczy języka HTML;
• Podobnie jak one, są osadzane w dokumencie
źródłowym;
• Punkt docelowy opisywany poprzez adres URI;
• Wyróżniane atrybutem xlink:type=”simple”; np.
<odsylacz xlink:href =”http://www.firma.com/dokument.htm”
xlink:type=”simple”>
• Możliwość wskazywania konkretnych elementów
dokumentu XML (lokalnego lub zewnętrznego):
– przy użyciu wartości jego identyfikatora: do URI
dołączamy ”#wartoscIdentyfikatora”, tj. np.
xlink:href=”#rozdzial_1”;
– bez użycia identyfikatora: korzystając ze środków języka
XPath, ew. XPointer; np. <odsylacz xmlns:xlink=
”http://www.w3c.org/2000/xlink” xlink:type=”simple”
xlink:href=”http://firma.com/dokument.xml#xpointer(
//sprawozdanie/zamowienia[4])” />
29
Odsyłacze rozszerzone (extended) i ich
składowe
• Wielokierunkowość – poprzez możliwość
przechowywania odesłań do wielu miejsc;
• Możliwość określania ról poszczególnych powiązań
odsyłacza;
• Wyróżniane atrybutem xlink:type=”complex”;
• Dostępne są następujące podelementy:
– Wskaźnik (locator), określający lokację zewnętrznych
(w stosunku do samego odsyłacza a niekoniecznie do
dokumentu) zasobów;
– Zasób (resource), określający lokalne zasoby. Musi
zawierać w sobie inne elementy XML, stanowiące
opisywany przezeń zasób.
– Łuk (arc), określający połączenia nawigacyjne pomiędzy
zasobami;
– Tytuł (title), określający czytelną dla człowieka nazwę.
• Powyższe podelementy mogą występować
samodzielnie albo wewnątrz odsyłacza complex.
30
Atrybuty opisujące odsyłacze
•
type – określa typ odsyłacza;
•
href – identyfikuje zasób wskazywany przez odsyłacz. Może to
być adres względny lub bezwzględny.
•
role – podaje URI zawierający opis roli zasobu wskazywanego
przez dany odsyłacz;
•
arcrole – podaje URI zawierający opis roli samego łuku
łączącego zasoby;
•
show, actuate – sposób prezentacji i przetwarzania
połączonych zasobów;
•
label – deklaruje etykietę, która może zostać wykorzystana przy
definiowaniu połączeń pomiędzy zasobami;
•
from, to – służą definiowaniu powiązań pomiędzy elementami w
oparciu o ich etykiety;
•
title – czytelna dla człowieka nazwa odnośnika podana w
postaci atrybutu.
Jak wspomniano wyżej, title może być również podawany jako
podelement.
Ta nadmiarowość została wprowadzona z myślą o umożliwieniu
umieszczania
wielu tytułów (np. w różnych wersjach językowych) dla danego
odnośnika.
31
Określanie przejść pomiędzy zasobami
• Wskazywane przez odnośnik (resource lub locator) mogą
być łączone łukami (arc), określającymi przewidziane
przejścia nawigacyjne pomiędzy elementami;
• W tym celu odnośniki opatruje się wartościami atrybutu
etykiety (label).
• W przeciwieństwie do identyfikatorów elementów, taka
konstrukcja umożliwia zdefiniowanie przejść pomiędzy
wieloma parami elementów za pomocą deklaracji jednego
łuku (np. rozdział-> spis treści).
• Pominięcie elementu to i / lub from powoduje dalsze
rozszerzenie deklaracji łuku na odpowiednio połączenia do
wszystkich i / lub od wszystkich zdefiniowanych
odsyłaczami zasobów.
• Przypomnijmy: rola samego łuku może być opisana poprzez
lokalizację podaną atrybutem xlink:arcrole. Pozwala to
niejako określić klasę danego łuku i wykorzystać tę
informację do grupowania przy prezentacji zasobów.
32
Odsyłacze rozszerzone
• Identyfikowane typem: xlink:type=”extended”;
• Mogą zawierać wewnątrz odsyłacze zasobów
(resource), odnośniki (locator), łuki (arc).
• Tworzą bazę odsyłaczy, umieszczaną zwykle w
odrębnym pliku.
• W ramach odsyłaczy rozszerzonych łuki mogą
łączyć jedynie lokalnie zdefiniowane zasoby.
• Zewnętrzne bazy odsyłaczy
– określane jako out-of-line links, w przeciwieństwie do
tradycyjnych odsyłaczy zwanych inline links;
– koncepcja redukuje problem aktualizacji odsyłaczy:
zestawienia odnośników na dany temat mogą zostać
„wyciągnięte przed nawias” i przechowywane w jednym
miejscu.
33
Określanie sposobu zachowania się
odsyłaczy
• Atrybut show określa sposób wyświetlania
wskazywanego zasobu:
– new: w nowym oknie/ramce;
– replace: zastąpienie aktualnie prezentowanej treści;
– embed: wstawienie treści odsyłacza w dokument;
– other: informacja o sposobie wyświetlania umieszczona
gdzie indziej;
– none: brak informacji o sposobie wyświetlania.
• Atrybut actuate określa sposób aktywowania
formularza:
– onLoad – przy ładowaniu dokumentu źródłowego;
– onRequest – w przypadku wybrania przez użytkownika;
– other – sposób aktywacji określony w innym miejscu;
– none – sposób aktywacji nie został określony.
34
Deklarowanie odsyłaczy wbudowanych w
dokument
• Jeśli definiujemy typ dokumentu, to
umieszczane w nim odsyłacze (jako
określonego rodzaju elementy z właściwymi im
atrybutami) należy uwzględnić w stosownym
DTD, jeśli jest stosowany.
• Atrybuty odsyłaczy definiujemy w DTD jako
wartości typu CDATA.
• Przewidziane specyfikacją wartości atrybutów
show oraz actuate można podać jako
wyliczenie.
• Można nałożyć dodatkowe ograniczenia, jeśli
np. nie przewidujemy wykorzystywania jakiejś
właściwości XLink w dokumencie.