Start / Artiklar / Introduktion till XLink

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.

Innehåll

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

1. Grundläggande begrepp

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.

1.1. Enkla och utökade länkar

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>

1.2. Integrerade och fristående länkar

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:

Inline-länk från en text 
till 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:

Länk mellan filer av
format som inte stödjer länkar

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.

1.3. Lokala och främmande resurser

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.

2. Namnrymd och vokabulär

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:

3. Utökade länkar

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.

3.1. Namnrymden

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>

3.2. Attributet xlink:type

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:

Relationen mellan de olika värdena på attributet xlink:type

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>

3.3. Underelement till utökade länkar

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.

locator

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:

Utökad länk med ett element av länktypen xlink:locator

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.

resource

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:

Utökad länk med element av länktyperna xlink:resource och xlink:locator

Detta är en fungerande XLink-länk. Det återstår dock ett element för att göra länken mer användbar.

title

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.

3.4. En-till-många-relationer

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:

Exempel på rendering av en-till-flera-relation

4. Beteendemässiga attribut

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.

5. XLink i DTD:n

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>