Dokumenttypsdefinition

Attribut och attribut-list-deklarationer

Elementen representerar dokumentets strukturella komponenter. De säger dock ingenting om elementens egenskaper, till exempel bildens eller tabellens storlek. Inte heller en enskild förekomst av ett element åtskiljer sig från förekomst av andra element av samma typ och därmed går det inte att referera till det.

För att kunna åtskilja individer ur samma elementtyp eller tilldela dem andra egenskaper brukar man tilldela dem olika attribut med tillhörande värden.

Attribut används för att tillföra extra information till elementen.

	Element: bild
	Attribut: bredd
	Attributvärde: 100

(och även)

	Element: bil
	Attribut: modell
	Attributvärde: volvo

I likhet med element och entiteter definieras attributen genom deklarationer, i det här fallet attribut-lista-deklarationer, där man först identifierar det element till vilket deklarerade attribut hör och sedan listar alla attribut som det aktuella elementet kan ta samt alla tilltänkta värden. En attributlista brukar följa elementdeklarationen.

Attributen namnges på samma sätt som element, och i likhet med element får inte namnen börja med bokstavskombination xml. Denna bokstavskombination har reserverats för eventuella framtida tillägg, till exempel redan fördefinierade attribut.

En bild, elementet img, kan till exempel tilldelas följande attribut:

Attribut-lista-deklarationer

Exempel:

<!ELEMENT img EMPTY>

<!-deklarationstyp för element av typ attributnamn attributvärde ingångsvärde standardvärde -->
<!ATTLIST img id id #IMPLIED  
    src cdata #REQUIRED  
    width %lenght #IMPLIED  
    height %lenght #IMPLIED  
    alt %text #REQUIRED  
    border %pixel #FIXED "0"
    align (left|center|right) #IMPLIED "left"
>          

Första raden innehåller min kommentar och är inte en del av deklarationen. Deklarationen identifierar elementtypen och dess attribut. Attribut med tillhörande värden, attributets ingångsvärde samt eventuellt standardvärde listas. De olika delarna åtskiljs med (helst tre) mellanslag. Varje attribut/värde-par skrivs på egen rad. Attributen har framhävts med fet stil.

<!ATTLIST

Börjar deklarationen. Nyckelordet ATTLIST talar om att det är en attribut-lista-deklaration.

img

Identifierar elementet för vilket deklarationen gäller. I detta fall element av typen img, dvs bilder. Efter det listas alla attribut

id

En unik identifikation. Genom att identifiera bilden kan man till exempel referera till den från andra element eller dokument.

id

Attributvärde som attributet id kan ta. Observera att i detta fall handlar det inte om en boolsk operator utan om ett specifikt attributvärde, ett nyckelord som talar om att värdet måste vara unikt och att det ska skapas av bokstäver, siffror m.m. Bara en förekomst av elementtypen per dokument kan ta detta attributvärde.

<img id="eva"> identifierar den aktuella bilden som eva. Ingen annan bild i dokumentet får ha samma namn.

#IMPLIED

Det finns inget utgångsvärde deklarerat för detta attribut. Attributet id är därmed valfritt. (Det finns inget krav på att identifiera bilder).

src

Attributet uppger bildens källa, dvs pekar till den fil som innehåller bilden.

cdata

Värdet lokaliserar filen, dvs specificerar dess adress. Då attributvärdet är CDATA behandlas inte adressen av parsern utan tas som den är.

<img id="eva" src="eva.gif">

#REQUIRED

Det finns ett utgångsvärde definierat för detta attribut. Attributet är obligatoriskt. (Som är förståeligt - kan inte bilden hämtas från en speciell adress kan den heller inte visas.)

width
height

Med dessa två valfria attribut kan bildens bredd och höjd specificeras. Dess attributvärde, entiteten %length har definierats någon annanstans i DTDn. Enligt denna definition kan strängen innehålla pixlar, centimetrar eller procent i entitetsdeklarationen.

<img id="eva" src="eva.gif" width="200" height="100">

alt

Detta obligatoriska attribut med värdet %text innehåller en alternativ text som ska visas i fall då användaren inte vill eller inte kan se bilden. Vilka tecken som entiteten %text får innehålla definieras i en entitetsdeklaration.

<img id="eva" src="eva.gif" width="200" height="100" alt="Denna bild föreställer .... ">

border

Med detta valfria attribut kan man specificera om bilden ska ha en ram runt om eller inte.

%pixel

Om bilden tar attributet border ska dess värde uppges i pixlar (entiteten %pixel definieras på en annan plats i DTDn).

<img id="eva" src="eva.gif" width="200" height="100" alt="Denna bild föreställer .... " border="2">

#FIXED

P.g.a. detta utgångsvärde måste det föregående påståendet ändras till "Om bilden skulle kunna ta attributet border ska dess värde uppges i pixlar".

#FIXED innebär att attributet och dess värde bestäms i DTDn och kan inte ändras i dokumentet.

Observera att #FIXED tillämpas väldigt sällan och speciellt inte i element av typen img eller för att "attributsätta" olika befattningar i företaget, som t ex VD. En sådan möjlighet finns dock, som här används enbart för exemplets skull.

"0"

Värdet är bestämt till "0" (noll) som betyder att bildens ram är lika med 0 pixlar, mao finns det ingen ram. Då attributet och dess värde är #FIXED kan det uteslutas helt och hållet.

align

Med detta optionella attribut kan bildens placering i förhållande till flödet, t ex den omringande texten, bestämmas.

(left | center | right)

Attributet align kan ta ett av de listade värden; left (vänster) eller center (centrera) eller right (höger). Inga andra värden accepteras. Bara ett värde ur listan kan uppges.

"left"

Attributets align standardvärde är left. Standardvärden uppges inte. Saknar bilden detta attribut kommer den att placeras till vänster.

Observera att alla attribut specificeras i starttaggen och att attributvärden måste citeras. Både enkla och dubbla citattecken kan användas. Specifik attributtyp kan tilldelas ett element bara en gång. Attributen i attribut-lista-deklarationen kan listas i valfri ordning.

<bild src="bild.gif" alt="Alternativ text" width="100" height="50">

I udda fall kan ett attribut tilldelas en värdelista, till exempel en lista innehållande namn på typsnitt. I HTML åtskiljs sådana värden med ett komma. Detta är förbjudet i XML. I XML åtskiljs värdena med ett mellanslag.

Interna parameterentiteter

Olika typer av element kan tilldelas samma attribut. I sådana fall är det mer praktiskt att skapa en parameterentitet utav dessa attribut och referera till den inifrån attributdeklarationen istället för att lista alla attribut.

Om elementet object kan ta samma attribut som img, kan följande parameterentitet med namnet %objattrs skapas:

<!ENTITY	 % objattrs
"		id	id			#IMPLIED	
		src	cdata			#REQUIRED	
		width	%length			#IMPLIED	
		height	%length			#IMPLIED	
		alt	%text			#REQUIRED	
		border	%pixel			#FIXED	'0'
		align	(left|center|right)	#IMPLIED	'left'
">

och refereras inifrån attributdeklarationerna för object och img (och alla andra deklarationer vars element kan ta samma attribut) .

<!ELEMENT img EMPTY> 
<!ATTLIST img  %objattrs;>

<!ELEMENT object (innehållsmodell)>
<!ATTLIST object  %objattrs; >

Attributvärde

Attributvärden kan vara av olika typer. De är: CDATA, ID, IDREF, IDREFS, NMTOKEN, NMTOKENS, ENTITY, ENTITIES, NOTATION. Det som skiljer de olika värdetyperna är tecknen som de får innehålla.

<elementnamn attributnamn="värde uppbyggt av olika tecken">
<elementnamn attributnamn="cdata">
<img src="bild.gif" />

CDATA

Vanliga textsträngar

ID

Med detta attributvärde identifieras en speciell förekomst av ett element. Värdet måste vara unikt. Det får bara finnas ett ID per elementtyp med ingångsvärdet #IMPLIED eller #REQUIRED.

IDREF

Element med detta attribut kan referera till ett annat element som identifierades med attributet id. Värdet måste vara identiskt med värdet av id-attributet i det element som refereras till. Genom att sammankoppla dessa två attribut kan man skapa en s.k. korsreferens.

<p id="eva">...</p>
<p idref="eva">...</p>

IDREFS

Samma som ovan plus tomrum (defineras i avsnittet med samma namn). Värdet innehåller en identifikationslista. Värdena i listan åtskiljs med ett mellanslag

NMTOKEN

Namnsymbol. Dessa värden får enbart innehålla namntecken, dvs tecken med vilka elementnamn och attributnamn kan skapas. Namntecken får innehålla bokstäver, siffror, bindestreck, understrykning, kolon och punkter. Observera att nmtoken inte får börja med bokstäverna xml. Attributlistor får endas byggas med NMTOKEN.

NMTOKENS

Dessa värden får innehålla namntecken enligt ovan plus tomrum (defineras i avsnittet med samma namn). Värdet innehåller en lista på namnsymboler. Värdena i listan åtskiljs med mellanslag.

ENTITY

Värdet är lika med ett entitetsnamn som har identifierats i entitetsdeklarationen.

ENTITIES

Samma som ovan plus tomrum (defineras i avsnittet med samma namn). Värdet innehåller en entitetslista. Värdena i listan åtskiljs med ett mellanslag.

NOTATION

Värdet är lika med ett notationsnamn som har identifierats i notationsdeklarationen.

Fördefinierade attribut

I XML definieras både element och attribut av dokumenttypens skapare. Det finns dock två attribut med tillhörande värden som redan är fördefinierade i XML-specifikationen. Då attributen redan är fördefinierade behöver man inte definiera om dem i DTDn. Attributen kan, utan undantag, tilldelas varje element. De är xml:space och xml:lang.

xml:space

I SGML-dokument tolkas multipla mellanslag som ett enda och tomrum tolkas som ett mellanslag. (Man säger att mellanslagen kollapsar.) Därför presenteras dokumenten oberoende av alla tomrum som om det inte fanns extra mellanslag eller tomrum. Attributet xml:space tillåter att man ändrar på dessa förhållanden. Attributet kan ta två värden: default och preserve:

Om elementet kod ska innehålla källkoden kan elementdeklarationen kompletteras med följande attributdeklaration:

<!ELEMENT kod (#PCDATA)>
<!ATTLIST kod xml:space (default | preserve) "preserve">

I deklarationen ändrar man standardvärdet default till preserve. Man kan även ändra värdet i själva dokumentet:

<kod xml:space="preserve">....</kod>

Standardvärdet default gäller om ett element saknar attributet xml:space.

Tomrum

Tomrum (white space) är ett gemensamt namn på följande tecken: ett eller fler blanktecken (mellanslag), #x20; returmatning, #x9; ny rad, #xD, eller tabb, #xA. White space betecknas i syntaxkonstruktionen (grammatiken) med bokstaven S. S definieras enligt följande:

S ::= (#x20 | #x9 | #xD | #xA)*

xml:lang

Attributet identifierar det språk som elementens innehåll är skrivet på. Attributvärdet kan vara CDATA eller NMTOKEN. Dessa bör helst vara en tvåbokstavlig språkkod som identifieras i ISO-standarden, ISO-639, där bl a svenska betecknas som sv och engelska som en. Hela listan kan hittas på http://www.oasis-open.org/cover/iso639a.html. Standardspråket kan definieras enligt följande:

<!ELEMENT citat (#PCDATA)>
<!ATTLIST citat xml:lang (sv | en) "sv">

Ovanstående definierar att elementet citat kan ta attributet xml:lang vars värde kan vara sv (svenska) eller en (engelska) och att standardvärdet är svenska. Dokumentinstansen kan därför se ut på följande sätt:

<stycke>svensk text<citat>svensk text</citat></stycke>
<stycke>svensk text<citat xml:lang="en">engelsk text</citat></stycke>

Standardvärdet behöver man inte uppge. Attributvärdet uppges enbart om man vill överskrida standardvärdet.

Genom att uppge elementens språk kan en stavningskontroll lättare göras. En språkkod hjälper även sökmoterer med dokumentets indexering - dokument med samma innehåll kan vara skrivna på olika språk, språkkoden hjälper användaren att välja "sitt språk".

Observera att språkkod och landskod inte betecknas på samma sätt. Landskoder regleras av ISO-standarden 3166 (http://www.oasis-open.org/cover/country3166.html). Svenska språket betecknas till exempel som sv medan Sverige betecknas som se. Alla svenska toppdomäner slutar på se.

Land		Landskod		Språk		Språkkod
Sverige		se		Svenska		sv
Danmark		dk		Danska		da
Norge		no		Norska		no
Finland		fi		Finska		fi
Tyskland		de		Tyska		de
USA		us		Engelska		en
Storbritannien	gb		Engelska		en

Attribut i XML

I ett språk där varje databyte kan representeras av ett element brukar man ofta ställa sig den nu klassiska frågan - element eller attribut? -. Dessvärre finns det inte något entydigt svar på denna fråga. Det enda svaret som kan ges är ... det beror på.

Vad man än bestämmer bör attributen i XML väljas med omsorg. Innan man börjar skapa dem bör man tänka noggrant på vilka som är lämpliga och om de behövs överhuvudtaget då de flesta attribut kan göra sig bättre som element. Man bör tänka i databastermer och på det optimala struktureringssättet av data. Innan ett attribut bestäms kan följande vara värt att överväga:

Attribut kan vara mer lämpade när:

Om data kommer att uppdateras med jämna mellanrum bör man använda varken attribut eller element utan entiteter. För det är just modulisering av data som XML handlar om.

element? attribut?
<artikel>
<titel>XML-introduktion</titel>
<skribent>Eva von Pepel</skribent>
........
</artikel>
<artikel titel="XML-attribut" skribent="Eva von Pepel">
......
</artikel>

Exempel 1

DTD

<!ELEMENT artikel (meta-info, body)>
<!ATTLIST artikel 
		titel    	CDATA	#REQUIRED
		skribent	CDATA	#REQUIRED
>

Dokumentinstans

<artikel titel="XML" skribent="Eva von Pepel">
......
</artikel>

I detta exempel kan attributet skribent lämpa sig bättre som element om det finns fler än en skribent som skrev artikeln. Finns det bara en skribent per artikel kan man med fördel använda skribent som attribut.

Exempel 2

DTD

<!ELEMENT bok (meta-info, body)>
<!ELEMENT meta-info (titel, forf+, forlag, pris)>
<!ELEMENT pris (#PCDATA)>
<!ATTLIST pris 
               valuta	     CDATA    #IMPLIED "SEK"
>

Dokumentinstans

<meta-info>
<titel>XML</titel>
<forf>Eva von Pepel</forf>
<forlag>KnowWare</forlag>
<pris>1000</pris>
</meta-info>

I exemplet kan pris ta attributet valuta. Då standardvärdet är SEK behöver man inte uppge någon valutabeteckning. Det pris som uppges tolkas som svenska kronor. Kommer boken däremot från ett amerikanskt förlag kan man överskrida standardvärdet genom ett annat attributvärde.

<pris valuta="USD">100</pris>

Observera att värdet USD enbart gäller i denna instans av elementet pris - som i dessa instanser där attributet förekommer. Brist på attribut antyder standardvärdet SEK.

Exempel 3

I detta förlag samlar man alla uppgifter om sina författare i ett element genom att ge elementet forf ett antal attribut. Då all information skrivs i form av attribut kan man göra elementet forf till ett tomt element.

DTD

<!ELEMENT meta-info (titel, forf+, pris)>
<!ELEMENT forf EMPTY>
<!ATTLIST forf
	namn		CDATA	#REQUIRED
	adress		CDATA	#REQUIRED
	tel-hem		CDATA	#IMPLIED
	tel-jobb	CDATA	#IMPLIED
	tel-mobil	CDATA	#IMPLIED
>

Dokumentinstans

<bok>
<titel>XML-introduktion</titel>
<forf namn="Eva von Pepel" adress="Finagatan, Stockholm" tel-hem="123" tel-mobil="456" />
<pris>1000</pris>
....
</bok>

namn och adress är obligatoriska attribut medan telefonerna är det inte. Även idag är det helt möjligt att inte alla har tre olika telefonnummer

Här kommer ett annat exempel på hur bokens metainformation skulle kunna struktureras:

DTD

<!ELEMENT meta-info EMPTY>
<!ATTLIST meta-info
	förlag		CDATA	#REQUIRED
	författare	CDATA	#REQUIRED
	titel	  	CDATA	#REQUIRED
	pris		CDATA   #IMPLIED 	"SEK"
>			

Dokumentinstans

<meta-info förlag="KnowWare" författare="Eva von Pepel" titel="XML-introduktion" pris="1000" />

Exempel 4

I detta exempel har attributen en mycket intim sammankoppling med elementet. De beskriver elementets egenskaper. Det finns ingen anledning att göra dem till barnelement. En byggfirma som anställer enbart målare och rörmokare skulle kunna registrera dem så här:

DTD

<!ELEMENT anst (namn, adress)>
<!ATTLIST anst
	id 	ID			#REQUIRED
	typ	(rörmokare | målare)	#REQUIRED
>

Dokumentinstans

<anst id="123" typ="målare">
<namn>
....
</namn>
<adress>
....
</adress>
</anst>

<anst id="124" typ="rörmokare">
<namn>
....
</namn>
<adress>
....
</adress>
</anst>

Valid HTML 4.0!