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:
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.
|
Börjar deklarationen. Nyckelordet |
|
Identifierar elementet för vilket deklarationen gäller. I detta fall element av typen |
|
En unik identifikation. Genom att identifiera bilden kan man till exempel referera till den från andra element eller dokument. |
|
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.
|
|
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). |
|
Attributet uppger bildens källa, dvs pekar till den fil som innehåller bilden. |
|
Värdet lokaliserar filen, dvs specificerar dess adress. Då attributvärdet är
|
|
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.) |
|
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.
|
|
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.
|
|
Med detta valfria attribut kan man specificera om bilden ska ha en ram runt om eller inte. |
|
Om bilden tar attributet border ska dess värde uppges i pixlar (entiteten
|
|
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".
Observera att |
|
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 |
|
Med detta optionella attribut kan bildens placering i förhållande till flödet, t ex den omringande texten, bestämmas. |
|
Attributet align kan ta ett av de listade värden; |
|
Attributets |
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.
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ä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" />
|
Vanliga textsträngar |
|
Med detta attributvärde identifieras en speciell förekomst av ett element. Värdet måste vara unikt. Det får bara finnas ett |
|
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
|
|
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 |
|
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 |
|
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. |
|
Värdet är lika med ett entitetsnamn som har identifierats i entitetsdeklarationen. |
|
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. |
|
Värdet är lika med ett notationsnamn som har identifierats i notationsdeklarationen. |
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:spaceI 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:
default är ett standardvärde och innebär att mellanslagen kommer att kollapsa preserve däremot tillåter att alla mellanslag bevaras; det kan vara mycket användbart om man till exempel vill presentera källkoden till en programvaraOm 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:langAttributet 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
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:
<titel>Introduktion till <betoning>XML</betoning></titel>) måste den vara ett barnelement och det går inte att göra ett attribut av den.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>