SGML tillåter namngivning av arbitära delar av dokumentets innehåll och omvandlar dem till åtskilda enheter. Dessa enheter kallas för entiteter och kan jämföras med fiktiva element.
En entitet är en namngiven del av ett dokument som inte tar hänsyn till själva struktureringen. Det kan vara några få tecken eller en hel fil som senare kan inkluderas i ett dokument. En entitet är alltså ett valfritt antal tecken till vilka kan refereras inifrån ett dataobjekt eller DTD.
Entitet: En enhet (ett valfritt antal tecken) som kan inkluderas i dokumentet genom att referera till den
Entiteter skapas med hjälp av entitetsdeklarationer som dels namnger den arbitära delen, dels definierar dess innehåll, eller som det också heter tilldelar detta namn ett värde. Entiteter kan senare inkluderas i andra deklarationer. Entiteter måste vara definierade innan någon annan deklaration kan referera till dem. Därför kommer de först i en DTD.
Det finns ett antal olika typer av entiteter. Skillnaden ligger i deras innehåll och funktion.
DTD namn Anrop |
Generella entiteter namnges med ett namn, t ex logo. Man kan referera till dem med hjälp av och-tecknet, &, följt av entitetens namn som (optionellt) avslutas med ett semikolon, &logo;. Entiteten logo kan innehålla en bild vars adress och/eller format beskrivs i entiteten. |
DTD %namn Anrop %namn; |
Parameterentiteter namnges med ett namn som dessutom föregås av procenttecken, %, t ex %artikel. Man kan referera till dem med hjälp av samma sträng som avslutas med ett semikolon, %artikel;. Parameterentiteten artikel kan innehålla (vara en "förkortning" för) en grupp av element, t ex kan den innehålla elementen meta-info och body som i sin tur innehåller andra element. Vid anrop expanderar den sträng av element som bildar dess innehåll. |
Innehåll av interna entiteter definieras i den aktuella entitetsdeklarationen.
Om ett antal element kan förekomma i olika föräldrar eller om ett antal attribut kan tilldelas olika element kan dessa barnelement eller återkommande attribut grupperas i en entitet. Dessa entiteter kan senare inkluderas i andra deklarationer, och på så sätt återanvändas. Istället för att deklarera en lång lista av enskilda element eller attribut anropar man entiteten. Till exempel:
<!ENTITY %artikel "(kapitel | avsnitt | rubrik | stycke)*">
grupperar elementen kapitel, avsnitt, rubrik och stycke i en entitet under namnet %artikel och fastställer regler för deras förekomst (de kan komma i valfri ordning 0 eller fler gånger). Ett förälder till de fyra elementen anropar entiteten istället för att deklarera dess förekomst genom att lista ett i taget.
<!ELEMENT bok %artikel>
XML-parsern expanderar entiteten till den ursprungliga strängen:
<!ELEMENT bok (kapitel | avsnitt | rubrik | stycke)*>
En parameterentitet kan innehålla (a) element/attribut, (b) element/attribut och andra entiteter eller (c) vara uppbyggd av endast entiteter:
<!ENTITY %huvud "(titel, skribent+)">
Även denna entitet kan inkluderas i boks deklaration.
<!ELEMENT bok %huvud,%artikel>
Elementettypen bok följs av entiteten %huvud som i sin tur följs av entiteten %artikel. Detta expanderas till:
<!ELEMENT bok (titel, skribent+), (kapitel | avsnitt | rubrik | stycke)*>
och deklarerar att: elementetet bok följs av
titel som följs avskribent som följs avkapitel eller avsnitt eller rubrik eller stycke och att dessa få förekomma 0 eller fler gångerExempel på parameterentitet ur DTD för XHTML 1.0 Strict
<!ENTITY % special "br | span | bdo | object | img | map">
som anropas från tre andra entiteter, bl a :
<,!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms">
När entiteter i innehållsmodellen har expanderat kommer kommer hela strängen att se ut så här:
<!ENTITY % inline "a | br | span | bdo | object | img | map | tt | i | b | big | small | em | strong | dfn | code | q | sub | sup | samp | kbd | var | cite | abbr | acronym | input | select | textarea | label | button">
Interna entiteter kan även användas för att ersätta text i dokumentet. Om till exempel en fras återkommer ofta i dokumentet kan man definiera dess innehåll i en entitetsdeklaration och sedan anropa entiteten för att få tillgång till dess innehåll:
<!ENTITY fras "Här kommer en lång och återkommande fras">
Den långa frasen kan senare infogas var som helst i dokumentet:
<stycke>Någon text &fras; texten fortsätter</stycke>
Observera att och-tecknet, &, markerar början på en entitet som följs av entitetens namn och avslutas med ett optionellt semikolon.
Externa entiteter saknar innehåll i sig själv utan hänvisar till en extern fil där innehållet finns. Denna externa fil kan vara en annan DTD eller en del av den . Det kan också vara ett helt annat dokument, t ex ett helt XML-dokument eller en bild. Observera att externa entiteter kan endast användas i externa DTDer. XML tillåter inte dess inkludering i interna DTDer, dvs sådana som skrivs in i själva dokumentet.
Dessa entiteter refererar till andra DTD:er eller delar av dem.
Dokumenttypen artikel definierar bara några få element och dess DTD, artikel.dtd, saknar till exempel tabeller. Om just tabeller har definierats i en annan DTD-snutt (modul), tabell.dtd, kan man hänvisa till den med hjälp av en extern entitet. I artikel.dtd skriver man då:
<!ENTITY %tabell SYSTEM "tabell.dtd">
I deklarationen namnges entiteten som (t ex) %tabell och hänvisar till modulens källa samt talar om att filen är i privat ägo. Observera att hela sökvägen bör uppges. Entiteten anropas med:
%tabell;
Det finns redan många sådana moduler i publik domän till vilka alla kan referera. De kan vara specifika som t ex just tabeller eller innehålla hela språk. Alla W3Cs moduler är i publik domän och kan anropas med hjälp av en publik identifierare. Många av dem kan även nås via en system identifierare. För att till exempel få tillgång till teckenuppsättningen Latin 1 (ISO-8859-1) som används i XHTML-dokument, där bl a alla svenska tecken ingår, inkluderas följande i DTDn:
<!ENTITY %HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "xhtml-lat1.ent">
och anropas:
%HTMLlat1;
Dessa entiteter fungerar som interna generella entiteter. Skillnaden är att interna entiteter innehåller ersättningstexten i sig själv medan externa entiteter pekar till en extern fil som innehåller ersättningstexten. Ersättningstexten kan vara en fras eller ett helt dokument, t ex dok.xml.
<!ENTITY dok SYSTEM "dok.xml">
För att infoga dok.xml i ett befintligt dokument anropar man det från dokumentinstansen:
&dok;
&dok; kommer att ersättas med innehållet av dok.xml.
Notationshänvisning
Externa generella entiteter används även för att hänvisa till notationsdeklarationer. (Notations-deklarationer beskrivs i avsnittet med samma namn.)
Vissa filer kan vara av speciellt format eller MIME-typ. En bild kan till exempel vara i .gif-, .jpg- eller .png-format. Ibland behöver applikationen denna information för att kunna bearbeta bilden. För att få tillgång till informationen används nyckelordet NDATA. Nyckelordet hänvisar till en notation i DTDn som innehåller denna information.
Om ett dokument använder svg-bildformat skapar man en notation med namnet (helst) svg. En entitet refererar till notationen med NDATA följd av notationens namn.
<!ENTITY logo SYSTEM "bilder/logo.svg" NDATA svg>
Här hänvisar entiteten logo till filen logo.svg som är i privat ägo (SYSTEM). Det finns en notation till filen (NDATA) med namnet svg.
Entiteten "innehållande" bilden och "via en länk" även informationen om dess format anropas:
<bild src="&logo;" />
Observera att anropet förutsätter att bild-element också är definierat i DTDn, t ex:
<!ELEMENT bild EMPTY>
Fem av entiteterna är redan fördefinerade i XML. Det är tecken med speciella betydelser, tecken som till exempel indikerar början på element eller entitet. Deras närvaro i dokumentet tolkas av parsernbokstavligen, dvs den förväntar sig ett element eller en entitet.
Om man vill att parsern ska tolka dessa tecken som vanlig text måste de ersättas med s.k. tecken-entitets-referenser. Dessa kan antingen vara numeriska teckenkoder eller namngivna sådana. Då de redan är fördefinierade behöver man inte definiera dem i DTDn.
| tecken | tillämpning | namn | nummer |
|---|---|---|---|
| < | taggstart | < | < |
| > | taggslut | > | > |
| & | entitetsstart | & | & |
| " | sträng start/slut | " | " |
| ' | sträng start/slut | ' | ' |
Observera att i väutformade dokument måste tecknen < och & ersättas med entiteter om de används för andra ändamål än de som beskrivs i "tillämpning".
XML använder UNICODE-teckenuppsättningen som standard. Uppsättningen innehåller över 40.000 olika tecken. Alla representeras med en egen teckenkod. Man kan använda dessa teckenkoder som entiteter och, i och med det, få tillgång till hela uppsättningen.
Numeriska entiteter kan skrivas både i decimalformat och hexformat. "Decimalentiteter" börjas med tecknen &#, efterföljs av decimalteckenkoden och avslutas med ett (optionellt) semikolon. Även "hexentiteter" börjar med tecknen &#, sedan följer ett x och efter det hexteckenkoden som avslutas med ett semikolon. Svenska bokstäver ersätts på följande sätt:
tecken decimal hex namn Ä Ä Ä Ä ä ä ä ä Ö Ö Ö Ö ö ö õ ö Å Å Å Å å å å å É É É É é é é é
Villkorliga sektioner är delar av DTDs externa subdokument (delmängd) som antingen kan inkluderas i eller exkluderas från dess logiska struktur.
Om till exempel en sektion innehållande elementen titel och skribent ska inkluderas i den slutliga versionen av artikeln medan kommentarer och/eller fotnoter ska exkluderas från utkasten:
<!ENTITY %slut "titel, skribent">
<!ENTITY %utkast "komment | fotnot">
definieras dessa inklusioner/exklusioner på följande sätt:
För att inkludera en sektion används nyckelordet INCLUDE. I och med det kommer sektionens innehåll att vara en del del av DTDn.
<!ENTITY %slut "INCLUDE">
För att exkludera en sektion används nyckelordet IGNORE. I och med det är sektionens innehåll inte längre en logisk del av DTDn.
<!ENTITY %utkast "IGNORE">
Exempel:
HTML 4 Strict tillåter inga ramar och därför exkluderas de från DTDn:
<,!ENTITY % HTML.Frameset "IGNORE">
HTML 4 Frameset tillåter ramar och därför inkluderas de i DTDn:
<!ENTITY % HTML.Frameset "INCLUDE">
Det som inkluderas respektive exkluderas är entiteten % HTML.Frameset. Själva entiteten definieras varken i HTML 4 Strict eller Frameset utan i Transitional. Därför innehåller Frameset-DTDn enbart följande rader: