Till startsidan för Jonas Webresurs

Namnutrymmen i Xml

1. Inledning

Den här sidan behandlar namnutrymmen eller namnrymder (namespaces) som man ibland också säger. Dessa används för att möjliggöra användningen av flera DTD:er samtidigt i ett dokument.

I första avsnittet berättar jag vom vad namnrymder är. Därefter får du lite teori i avsnitt 3 och 4. De sista två kapitlen ger praktiska exempel på det jag har sagt.

2. Vad är namnutrymmen?

Som jag skrev på sidan "Lär dig Xhtml" förekommer Xhtml i tre olika varianter: strict, transition och frameset. När man berättar vilken av dessa man använder anger man dess namnutrymme:

<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/TR/xhtml1">

Jag kommer att prata mer om det här DOCTYPE-elementet i avsnitt 4. Här är jag mer fokuserad på det andra elementet, där en namnrymd definieras för elementet <html>.

Detta ser likadant ut i Xml. Ett exempel på detta är följande:

<musik xmlns="dtd/">

Attributet xmlns eller "Xml NameSpace", definierar en URI för elementet <musik> och dess underelement. Har man flera namnutrymmen för elementen i sitt dokument kan man i princip deklarera dem på två olika sätt, antingen i rotelementet eller i det element där namnutrymmet skall gälla.

Vi börjar med att definiera det extra namnutrymmet i rotelementet:

<musik xmlns="dtd/"
   xmlns:presentation="dtd/">
<musik>
<titel>Veneer</titel>
<presentation:titel>Presentation av José González</presentation:titel>
</musik>

Här hänvisar jag till två olika <titel>-element definierade i två olika DTD:er, dels den som anges som default i rotelementet <musik> och dels "presentation".

Kolontecknet (:) anger att elementet har ett visst namnutrymme. Kolon får endast användas för element som har namnutrymmen. Man bör alltså inte använda kolontecknet om man inte använder namnutrymmen.

Man kan sedan också definiera ett namnutrymme inne i ett element:

<musik xmlns="dtd/">
<musik>
<titel>Veneer</titel>
<presentation:titel xmlns:presentation="
xmlns:presentation="presentation.dtd">Presentation av José González</presentation:titel>
</musik>

Självklart gäller här att man inte får använda två olika namnutrymmen till samma dokument. Det är därför man använder sig av prefixet "presentation".

Det som är speciellt med namnutrymmen är att de sätter en etikett på ett element. Etiketten talar om var tolkningen till elementet skall hämtas, men ger inte själv någon tolkning. Namnutrymmen är alltså en slags vägskyltar, som talar om riktningen till en viss plats, utan att ange hur platsen ser ut.

Det är viktigt att namnutrymmen är unika. Det innebär att man måste tala om var DTD:erna till "musik" och "presentation" finns. Detta görs med hjälp av "qualified names" eller Qnames, som de kallas i W3Cs specifikationer.

3. URL, URI och URN

För Xml finns det en särskild specifikation för namnutrymmen. I denna står bl.a att namnutrymmen skall identifieras med URI:er. Men vad är en URI?

Först och främst är det en skillnad mellan en URI och en URL. URI står för "Uniform Resource Identifier", medan URL står för "Uniform Resource Locator". En URI är namnet på en viss resurs, medan en URL är ett namn på en viss plats.

Ett sätt att förklara skillnaden är att säga att i Xml länkar man alltid till en viss information eller rymd, medan man i Html länkar till en specifik fysisk plats:

Xml:
Html: namnutrymmen.html

En URI kan därför vara detsamma som en URL, men kan dessutom vara något mer, t.ex en viss mapp. Men en URI kan dessutom vara något som kallas för en URN eller "Uniform Resource Name". De är inte bara ovanliga utan också svåra att förstå sig på. De är nämligen namn på särskilda tillstånd och har inte något med en fysisk plats att göra.

En URN kan handla om att man "länkar" till det tillstånd då fler än 20.000 besökare läst ett dokument. Men det kan också vara ett register där URN:en pekar på det tillstånd då en person har ett visst personnummer. Den skulle då kunna skriva så här:

urn:personnummer:0000-00-00-0000

Först kommer "urn", som talar om att det är en urn. Därefter följer "personnummer", som är det utrymme URN:en gäller. Detta kallas för NID eller "namespace identifier". Efter nästa kolon följer sedan ett unikt namn, NSS eller "namespace specific string", där varje personnummer anges efter principen 0000-00-00-0000.

4. Publika Identifierare (FPI)

Om vi återvänder till DOCTYPE-elementet från exemplet ovan, ser vi att det innehåller en identifierare, PUBLIC:

<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

PUBLIC refererar här inte till en viss fil utan till en viss katalog, med en eller flera DTD:er. Det finns olika sätt att skapa sådana referenser, men här har man använt ett system som kallas FPI eller "Formal Public Identifiers". Syntaxen ser ut så här:

-//Ägare//Beskrivning//Språk//Version

Om vi börjar från början ser vi först ett litet minustecken. Detta talar om för oss att katalogen är registrerad. Står där i stället ett plustecken är katalogen oregistrerad. Sedan följer två snedstreck, //, vilka separerar de olika delarna.

Ägare talar om vem som äger katalogen. Beskrivning ger en kortfattad beskrivning av vad det är som identifieras (vad katalogen innehåller). Efter dessa två kommer information om vilket språk och vilken version katalogen har.

I exemplet ovan ser vi också tillägget "http://www.w3.org/TR/html4/strict.dtd" efter katalogangivelsen. Denna använder man ifall Xml-tolken inte hittar rätt DTD i katalogen. Då kan den använda en alternativ DTD. Ligger filen i samma mapp som dokumentet behöver man inte ange hela adressen utan endast filnamnet räcker då.

5. Skapa en extern DTD

När man skriver exempel på olika Xml-dokument är det lätt att glömma bort att visa fullständiga exempel. Jag har t.ex här ovan blott visat hur man länkar till externa DTD:er, men inte hur man skapar dem. Därför har jag nu tagit med ett exempel där du kan se både hur DTD:n ser ut, hur man skriver i Xml-dokumentet och hur webbläsaren tolkar det.

Jag har utgått ifrån mitt första exempel och flyttat ut DTD:n ur den och lagt den i en separat fil:

Så här ser DTD:n ut: exempel_6_dtd.html >
Koden i Xml-dokumentet: exempel_6.html >
Xml-sidan där båda sammanförs: exempel_6.xml >

6. Blanda två DTD:er

Genom att kunna blanda två DTD:er kan man också blanda DTD:n för Xml i förra exemplet med DTD:n för Html. I det här exemplet har jag lagt till Html-kod för en recension av den skiva jag skapat dokumentet om. Jag har tagit bort en del av de gamla elementen, för att få en mer överskådlig sida:

Så här ser DTD:n ut: exempel_7_dtd.html >
Koden i Xml-dokumentet: exempel_7.html >
Xml-sidan där båda sammanförs: exempel_7.xml >


Den här sidan är en del av Jonas Webresurs - www.jonasweb.nu - copyright © 1998-2011