Start / Artiklar / Introduktion till XLink
Gustaf Liljegren <gustaf.liljegren@xml.se>
Notera: För att tillgodogöra dig det här bör du i stora drag ha förstått specifikationerna XML och Namespaces for XML. Dessutom är kännedom om webbadresser, så kallade URI:er, nödvändigt. Erfarenhet av länkning i HTML underlättar.
En länk är en relation mellan två eller flera resurser. Från HTML har vi vant oss vid att länkar är enkelriktade förbindelser från ett dokument till ett annat. Tanken är att man i XML även ska ha möjlighet att relatera till flera dokument samtidigt, beskriva länkarna med metadata och skapa separata länkdatabaser. XML Linking Language (XLink), som är en del i det grundpaket man planerade runt XML från början, specificerar hur man åstadkommer dessa finesser.
1. Grundläggande begrepp
1.1 Enkla och utökade länkar
1.2 Integrerade och fristående länkar
1.3 Lokala och främmande resurser
2. Namnrymd och vokabulär
3. Utökade länkar
3.1 Namnrymden
3.2 Attributet xlink:type
3.3 Underelement till utökade länkar
3.4 En-till-många-relationer
4. Beteendemässiga attribut
5. XLink i DTD:n
Länkar som vi är vana att se dem i en webbläsare, är oftast understruken text på vilken man kan klicka för att förflytta sig till ett annat dokument. I XLink har man valt ett mer generellt tillvägagångssätt där det inte är lika självklart hur länken ser ut, om den alls syns, hur den aktiveras och vad som händer då. XLink erbjuder två former av länkar: enkla och utökade länkar. Dessutom kan en länk vara integrerad eller fristående, samt innehålla lokala och främmande resurser. Det här kapitlet reder ut begreppen.
Enkla länkar ("simple links") motsvarar den typ av länkar vi känner igen från HTML, det vill säga en länk från ett dokument till ett annat. Det är syntaxmässigt en fristående genväg i XLink. Så här kan en enkel länk se ut:
<organisation xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://www.xml.se"> XML Sweden </organisation>
I verkligheten behöver man dock inte skriva så här mycket. Avsnittet om XLink i DTD:n berättar om hur man minimerar inmatningen med fasta attributlistdeklarationer.
Med utökade länkar ("extended links") kan man relatera fler än två resurser. Därför har de också sin egen inre elementstruktur, där en rad olika attribut kan användas för att beskriva länkens funktion och innehåll. Varje enkel länk kan också beskrivas i syntaxen för utökade länkar, men det blir onödigt pratigt:
<organisation xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> <text xlink:type="resource">XML Sweden</text> <uri xlink:type="locator" xlink:href="http://www.xml.se"/> </organisation>
En av de viktigaste egenskaperna för en länk är hur deklarationen av länken förhåller sig till de resurser den refererar till. I HTML finns det alltid en resurs inbakad i länkelementet ("linking element"), som till exempel den text som visas understruken och är klickbar i en webbläsare. I följande HTML-exempel innehåller länkelementet texten "Singapore":
<a href="singapore.gif">Singapore</a>
Länkelementet skapar relationen mellan texten "Singapore" och en främmande resurs (se nedan) - i det här fallet en bild:
A
-elementet i HTML är ett exempel på en integrerad länk ("inline link"). Kännetecknande för integrerade länkar är just att länkelementet själv innehåller en av resurserna i länken. I XLink skulle man förmodligen uttrycka det som en enkel länk:
<bild xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="singapore.gif"> Singapore </bild>
Något som saknas i HTML är möjligheten att deklarera länkar mellan dokument man själv inte har behörighet att redigera, eller länkar mellan filer som inte kan lagra länkinformation (som olika kontors- och multimediaformat). I vissa sammanhang kan det också vara omständligt att behöva uppdatera länkarna i varje dokument för sig. Kort sagt behövs det ibland en möjlighet att separera länkning från innehåll, på samma sätt som man idag skiljer innehåll från utformning med hjälp av stilmallar.
En fristående länk ("out-of-line link") är en deklaration av en länk som själv inte innehåller någon resurs. Deklarationen kan med fördel läggas helt utanför de länkade dokumenten. Nästa illustration ger exempel på ett fall då detta inte bara är att föredra, utan är helt nödvändigt:
För att ett program ska kunna förstå relationen mellan bilden och ljudet måste det finnas en länk deklarerad någonstans. Men varken bilden eller ljudfilen kan ha några länkar inom sig. Därför måste deklarationen av länken ligga i ett separat XML-dokument. Länken skulle kunna se ut så här:
<djur xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> <bild xlink:type="locator" xlink:href="kossa.gif"/> <ljud xlink:type="locator" xlink:href="muu.wav"/> </djur>
Bara själva relationen anges i den här länken. Det räcker kanske för vissa tillämpningar men inte för andra. I de flesta fall behöver man också ha information om i vilken riktning länken går, hur den aktiveras och vad som ska hända då.
Notera: Bara utökade länkar kan vara fristående och innehålla fler än en främmande resurs.
Lokala resurser ("local resources") är inbakade i länkelementet, som texten "Singapore". Främmande resurser ("remote resources") ligger utanför länkelementet, oftast i en annan fil. Bilderna och ljudfilen i exemplen ovan är främmande resurser. I praktiken kan en främmande resurs finnas i samma fil som länkelementet, men aldrig som en av länkelementets resurser. Det ligger dock utanför diskussionen för XLink, närmare bestämt i XPointer.
Ett länkelement kan innehålla både lokala och främmande resurser. Om länken innehåller en eller flera lokala resurser betraktas den alltid som en integrerad länk. Fristående länkar saknar lokala resurser.
XLink har sin egen namnrymd, till vilken man rekommenderar prefixet xlink
. Det är kopplingen till namnrymden som gör att ett XLink-medvetet program kan skilja länkar från annan uppmärkning. Namnrymden ser ut så här:
http://www.w3.org/1999/xlink
XLink har inga egna element. Istället finns det åtta globala attribut ("global attributes"). Att de är globala betyder att de kan användas fritt, i vilket element som helst som står under namnrymden. Eftersom de har sitt prefix (xlink
), kan de utan risk blandas med andra attribut. Här är de:
Till skillnad från enkla länkar, som alltid består av ett element, har utökade länkar en inre elementstruktur. Strukturen avgränsas av ett länkelement kopplat till namnrymden. De underordnade elementen används för att ange länkens funktion, resurser och relationer, samt att beskriva resurserna i läsbar text.
Innan man kan tillämpa XLink på ett element måste det underordnas namnrymden.
Underelement till länkelementet är förstås också inbegripna i namnrymden. Här
deklarerar jag att jag vill använda elementet destination
för
länkning med XLink:
<destination xmlns:xlink="http://www.w3.org/1999/xlink"> ... </destination>
Attributet xlink:type
har en särskild plats bland de andra
attributen i XLink. Det kan anta något av sju specificerade värden, som ger
ett elementet olika slags identitet och karaktär i länksammanhang.
Värde | Beskrivning |
---|---|
simple | elementet utgör länkelement i en enkel länk |
extended | elementet utgör länkelement i en utökad länk |
none | elementet används inte för länkning |
locator | elementet adresserar främmande resurser |
arc | elementet beskriver riktning och sammanhang mellan resurser |
title | elementet beskriver länken i sin helhet |
resource | elementet innehåller en lokal resurs |
I ett länkelement kan xlink:type
anta något av värdena simple
för enkla länkar, extended
för utökade länkar och none
, som används för att temporärt inaktivera en länk utan att ta bort koden. De övriga fyra används i underelement till extended
. Värdenas inbördes relation kan därför illustreras på det här sättet:
Förutom att ge ett element en speciell identitet i XLink-sammanhang, bestämmer värdet på xlink:type
vilka andra XLink-attribut som får förekomma i ett element. Tabellen nedan visar vilka globala attribut som är obligatoriska (O) respektive tillåtna (T) då xlink:type
har ett visst värde.
simple | extended | locator | arc | resource | title | |
---|---|---|---|---|---|---|
type | O | O | O | O | O | O |
href | T | O | ||||
role | T | T | T | T | T | |
title | T | T | T | T | T | |
show | T | T | ||||
actuate | T | T | ||||
from | T | |||||
to | T |
Som framgår av tabellen är xlink:type
obligatoriskt för alla element som använder XLink-attribut. Om jag väljer värdet extended
, gör jag elementet destination
till ett länkelement för en utökad länk. Man kan säga att destination
blir ett element av länktypen "extended".
<destination xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> ... </destination>
När ett element givits länktypen "extended" är det början till en utökad länk, som sedan beskrivs närmare i ett eller flera underelement. Dessa element kan ha någon av fyra olika länktyper (se figuren i förra avsnittet). Nu ska vi titta närmare på tre av dem: locator
, resource
och title
.
Nu adderar jag ett element av länktypen locator
till länkelementet:
<destination xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> <uri xlink:type="locator" xlink:href="http://www.flyg.se/resor/berlin.xml"/> </destination>
Vitsen är att elementet uri
ska bära en URI till en webbsida. Eftersom det är ett element av länktypen locator
, är attributet xlink:href
obligatoriskt (se tabellen i förra avsnittnet). Det adresserar alltid till en främmande resurs, i detta fall en uppdiktad sida om Berlin. Så här kan länken representeras i bild:
Precis som i levande livet behövs det minst två för att en relation ska uppstå. Här finns det bara en resurs, men inget att länka sig ifrån. Enkla länkar utgår alltid från där länken är deklarerad. I utökade länkar finns det två sätt att fortsätta. Ett sätt är att låta startpunkten vara en lokal resurs, till exempel ordet "Berlin". Då anses länken vara en integrerad länk, eftersom det finns en lokal resurs. Det andra sättet är att skapa ännu ett element av länktypen locator
. Då blir det en fristående länk eftersom det saknas en lokal resurs.
Jag väljer att länka mig från en lokal resurs. Det gör man med hjälp av ett element av länktypen "resource":
<destination xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> <text xlink:type="resource">Berlin</text> <uri xlink:type="locator" xlink:href="http://www.flyg.se/resor/berlin.xml"/> </destination>
Element av länktypen resource
använder elementinnehållet för att
specificera resursen. I det här fallet är det bara ren text, i andra fall
kan det vara uppmärkt och strukturerad information. Så här ser länken ut nu:
Detta är en fungerande XLink-länk. Det återstår dock ett element för att göra länken mer användbar.
För att ett datorprogram ska kunna ge raka besked om vart man hamnar om länken aktiveras, bör länken ha med en beskrivande rubrik - ett element av länktypen title
. Så här kan det se ut:
<destination xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> <rubrik xlink:type="title">Utbudet av resor till Berlin</rubrik> <text xlink:type="resource">Berlin</text> <uri xlink:type="locator" xlink:href="http://www.flyg.se/resor/berlin.xml"/> </destination>
Länktypen title
ska inte förväxlas med attributet. Länktypen
ger hela elementet egenskapen av en rubrik och används till att beskriva länken
i sin helhet, medan attributet kan användas i element av andra länktyper, för
att beskriva till exempel en viss resurs.
Anta att en resebyrå skrivit kontrakt med flera hotell i Berlin. Med dagens HTML hade vi först fått länka oss till en förteckning över hotellen, och sedan vidare beroende på vilket hotell vi vill läsa vidare om. Med framtidens webbläsare kommer vi att kunna hoppa över mellanledet genom att deklarera en-till-många-relationer:
<hotell xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended"> <rubrik xlink:type="title">Hotell i Berlin</rubrik> <text xlink:type="resource">Berlin</text> <uri xlink:type="locator" xlink:title="Hotel Skandal (350 DM)" xlink:href="skandal.xml"/> <uri xlink:type="locator" xlink:title="Hotel Gemütlich (200 DM)" xlink:href="gemutlich.xml"/> <uri xlink:type="locator" xlink:title="Hotel Hausgebrauch (100 DM)" xlink:href="hausgebrauch.xml"/> </hotell>
Vad händer då när den här länken aktiveras? Hur ska ett program kunna veta vilken av de främmande resurserna den ska hämta när det finns tre att välja på? Det är upp till programmet. En webbläsare skulle till exempel kunna visa en lista på tillgänliga länkar, där användaren väljer en:
Attributen xlink:actuate
och xlink:show
är speciellt framtagna för webbläsare. Funktionaliteten har vi redan sett i HTML, fastän den i XLink blivit mer koncis. På grund av det stora antalet möjliga tillämpningar av XLink är attributen ganska löst reglerade och man tillåter tillägg.
Attributet xlink:actuate
ger möjlighet att ange när en resurs ska hämtas. Det kan ske på två sätt: onLoad
hämtar resursen direkt, tillsammans med dokumentet där länken är deklarerad. Bilder och stilmallar vill man gärna hämta samtidigt. Har attributet värdet onRequest
, hämtas resursen först när användaren ber om det, till exempel klickar på en länk. Det använder man till exempel för referenser till andra dokument.
Med attributet xlink:show
specificerar man på vilket sätt resursen ska bli synlig. Värdet new
öppnar ett nytt fönster, replace
ersätter innehållet fönstret med den refererade resursen, och embed
gör plats för resursen i fönstret, på den plats där länken är deklarerad.
Notera: XLink specificerar inte standardvärdet. Det gör man i DTD:n genom en standarddeklaration av attributvärdet.
Attributen från XLink måste finnas deklarerade i DTD:n för att dokumentet ska kunna valideras. Det finns inget som hindrar att samma element kan innehålla både XLink-attribut och andra attribut. Notera även att man för ett element bara behöver deklarera de XLink-attribut man använder.
DTD:n kan också avlasta dokumenten i hög grad, genom att göra vissa attributvärden fasta (#FIXED
). Nästan alltid är det samma element som används för länkar och nästan alltid används de på samma sätt. Det gör att mycket av deklarationerna vi sett i exemplen ovan i själva verket kan läggas i DTD:n, för att minimera inmatningen i dokumenten. Titta på det första exemplet igen, där en enkel länk används för att hänvisa till en webbplats:
<organisation xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://www.xml.se"> XML Sweden </organisation>
Minsta möjliga DTD skulle kunna se ut så här:
<!ELEMENT organisation (#PCDATA)> <!ATTLIST organisation xmlns:xlink CDATA #REQUIRED xlink:type NMTOKEN #REQUIRED xlink:href CDATA #IMPLIED >
Emellertid är ju namnrymden för XLink är alltid densamma och värdet på
xlink:type
varierar sällan, eftersom varje element oftast bara
har en uppgift i länksammanhang. Det är bara xlink:href
som
behöver ändras från länk till länk. De andra två attributen kan lika bra
deklareras som fasta:
<!ELEMENT organisation (#PCDATA)> <!ATTLIST organisation xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink" xlink:type NMTOKEN #FIXED "simple" xlink:href CDATA #IMPLIED >
Nu blir varje länk betydligt lättare att skriva:
<organisation xlink:href="http://www.xml.se">XML Sweden</organisation>