[This local archive copy mirrored from the canonical site: http://www.agora.ro/~cmatei/xml/RecXMLVR.html; links may not have complete integrity, so use the canonical document at this URL if possible.]

Extensible Markup Language (XML) 1.0

Acest document este o traducere a documentului original din limba engleză și din acest motiv el poate conține erori. Dacă descoperiți astfel de erori vă rog să le anunțați via e-mail la adresa: cmatei@agora.ro.

Versiunea în limba engleză se află la adresa: http://www.w3.org/TR/1998/REC-xml-19980210.html.

În limba română el se află la adresa: http://www.agora.ro/~cmatei/xml/RecXMLVR.html.

Traducerea și adaptarea pentru limba română a fost realizată de către Crystian (cmatei@agora.ro).

Copyright  ©  1998 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply.


W3CREC-xml-19980210

Extensible Markup Language (XML) 1.0

Recomandarea W3C din 10 Februarie 1998

Această versiune

http://www.w3.org/TR/1998/REC-xml-19980210
http://www.w3.org/TR/1998/REC-xml-19980210.xml
http://www.w3.org/TR/1998/REC-xml-19980210.html
http://www.w3.org/TR/1998/REC-xml-19980210.pdf
http://www.w3.org/TR/1998/REC-xml-19980210.ps

Ultima versiune

http://www.w3.org/TR/REC-xml

Editori

Tim Bray, Textuality and Netscape (tbray@textuality.com)
Jean Paoli, Microsoft (jeanpa@microsoft.com)
C.M. Sperberg-McQueen, University of Illinois at Chicago (cmsmcq@uic.edu)

Abstract

Extensible Markup Language (XML) este un subset al SGML-ului ce este descris complet în acest document. Scopul este de a permite SGML-ului generic să fie furnizat, primit și procesat pe Web, în același mod în care este posibil acum cu HTML-ul. XML-ul a fost proiectat pentru o implementare mai ușoară și pentru interoperabilitate, atât cu SGML-ul cât și cu HTML-ul.

Statutul acestui document

Acest document (N. T. Este vorba despre versiunea originală în engleză.) a fost revăzut de către membrii W3C și de către alte părți interesate și a fost aprobat de către Diretor ca și recomandare W3C. Este un document stabil și poate fi utilizat ca și material de referință sau citat ca și referință normativă dintr-un alt document. Rolul W3C în realizarea acestei recomandări este acela de a îndrepta atenția asupra specificației și de a-i promova desfășurarea pe o arie întinsă. Acest lucru îmbogățește funcționalitatea și interoperabilitatea Web-ului.

Acest document specifică o sintaxă creată prin reducerea unui standard de procesare al textului existent și utilizat pe o arie largă în toată lumea (Standard Generalized Markup Language, ISO 8879:1986(E) amendat și corectat), pentru utilizarea ei pe World Wide Web. Ea este un produs al W3C XML Activity, despre care puteți găsi detalii la http://www.w3.org/XML. O listă a recomandăriilor W3C și a altor documente tehnice poate fi găsită la http://www.w3.org/TR.

Această specificație utilizează termenul de URI, care este definit de către [Berners-Lee], o muncă ce se află în desfășurare care se așteaptă să întregească [RFC1738] și [RFC1808].

O listă a erorilor cunoscute a acestei specificații este disponibilă la http://www.w3.org/XML/xml-19980210-errata.

Vă rugăm să raportați erorile din acest document la xml-editor@w3.org. (N.T. Pentru versiunea românească a acestei specificații, vă rugăm să raportați erorile la cmatei@agora.ro.)

Cuprins

    1. Introducere
        1.1 Origini și deziderate
        1.2 Terminologie
    2. Documentele
        2.1 Documente XML bine formate
        2.2 Caracterele
        2.3 Constructori sintactici comuni
        2.4 Datele caracter și marcajele
        2.5 Comentariile
        2.6 Instrucțiuni de procesare
        2.7 Secțiunile CDATA
        2.8 Prologul și Declararea Tipului de Document
        2.9 Declarația documentului independent
        2.10 Tratarea spațiilor albe
        2.11 Tratarea sfâșiturilor de linie
        2.12 Identificarea limbajului
    3. Structuri logice
        3.1 Marcajele de început, marcajele de sfârșit și marcajele elmentelor goale
        3.2 Declarațiile tipurilor de elemente
            3.2.1 Conținutul unui element
            3.2.2 Conținut mixat
        3.3 Declarațiile listelor de atribute
            3.3.1 Tipuri de atribute
            3.3.2 Valoriile implicite ale atributelor
            3.3.3 Normalizarea valoriilor atributelor
        3.4 Secțiunile condiționale
    4. Structuri fizice
        4.1 Referințele la caractere și la entități
        4.2 Declarații de entități
            4.2.1 Entități interne
            4.2.2 Entități externe
        4.3 Entități parsate
            4.3.1 Declarație de text
            4.3.2 Entități parsate bine formate
            4.3.3 Codificarea caracterelor în entități
        4.4 Tratamentul aplicat de către procesorul XML entitățiilor și referințelor
            4.4.1 Nerecunoscut
            4.4.2 Inclus
            4.4.3 Inclus dacă se validează
            4.4.4 Interzis
            4.4.5 Inclus în literal
            4.4.6 Atenționare
            4.4.7 Evitat
            4.4.8 Inclusă ca și PE
        4.5 Construcția textului de înlocuit al unei entități interne
        4.6 Entitățile predefinite
        4.7 Declarațiile notaților
        4.8 Entitatea document
    5. Conformanța
        5.1 Procesoarele validatoare și non-validatoare
        5.2 Utilizarea procesoarelor XML
    6. Sistemul de notare

Anexe

    A. Referințe
        A.1 Referințe normative
        A.2 Alte referințe
    B Clasele de caractere
    C. XML și SGML (Ne-normativ)
    D. Expansiunea referințelor la entități și la carctere (Ne-normativ)
    E. Modele de conținut deterministice (Ne-normativ)
    F. Autodetecția codificării caracterelor (Ne-normativ)
    G. W3C XML Working Group (Ne-normativ)

1. Introducere

Extensible Markup Language, abreviat XML, descie o clasă de obiecte numite documente XML și descrie parțial comportamentul unor programe de computer care le procesează. XML este o aplicație profil sau o formă restrictivă a SGML-ului, Standard Generalized Markup Language [ISO8879]. Prin construcție, documentele XML se conformează documentelor SGML.

Documentele XML sunt realizate din unități de stocare numite entități, ce conțin date parsate sau neparsate. Datele parsate sunt realizate din caractere, unele dintre ele formând date caracter iar altele ca marcaje. Marcajele codifică o descriere a schemei de stocare a documentului și structura logică. XML furnizează un mecanism pentru a impune constrîngeri asupra schemei de stocare și a structurii logice.

Un modul software numit procesor XML este utilizat pentru a citi documente XML și pentru a da acces la structura și conținutul lor. Se consideră că un procesor XML își face munca în spatele unui alt modul, numit aplicație. Această specificație descrie comportamentul cerut unui procesor XML în termeni ce spun cum trebuie să citească datele XML și ce informații trebuie să-i furnizeze aplicației.

1.1 Origini și deziderate

XML a fost dezvoltat de către un grup de lucru XML (XML Working Grup - cunoscut la început ca și SGML Editorial Review Board) format sub auspicile Consorțiului World Wide Web (W3C) în anul 1996. El a fost condus de către Jon Bosak de la Sun Microsystems cu participarea activă a unui grup de interes special XML (XML Special Interest Group - cunoscut în trecut ca și SGML Working Group), organizat tot de către W3C. Membrii XML Working Group sunt dați într-o anexă. Dan Connolly a ținut contactul între WG și W3C.

Scopurile proiectate pentru XML sunt:

  1. XML trebuie să fie simplu de utilizat pe Internet.
  2. XML trebuie să suporte o mare verietate de aplicații.
  3. XML trebuie să fie compatibil cu SGML.
  4. Trebuie să fie ușor să fie scrise programe ce vor procesa documente XML.
  5. Numărul facilitățiilor opționale din XML sunt reduse la minimum, ideal, la zero.
  6. Documentele XML trebuie să fie citibile de către utilizatori și clare într-un mod rezonabile.
  7. Designul XML ar trebui să fie pregătită rapid.
  8. Designul XML trebuie să fie formal și concis.
  9. Documentele XML trebuie să fie ușor de creat.
  10. Caracterul lapidar din marcajele XML să fie de o importanță minimă.
Această specificație, împreună cu standardele asociate (Unicode și ISO/IEC 10646 pentru caractere, Internet RFC 1766 marcajele de identificare ale limbajului, ISO 639 pentru codurile numelor de limbaje și ISO 3166 pentru codul numelor de țări) furnizează toate informațiile necesare pentru a înțelege XML Versiunea 1.0 și pentru a implementa programe de computer care să îl proceseze.

Această versiune a specificațiilor XML poate fi distribuită liber, atâta timp cât tot textul cât și toate notițele legale rămân intacte.

1.2 Terminologie

Terminologia utilizată pentru a descrie documentele XML este definită în corpul acestei specificații. Termenii definiți în lista următoare sunt utilizați în construcția definițiilor și în descrierea acțiuniilor unui procesor XML:
poate (may)
Documentele care se conformează și procesoarele pot să facă acest lucru dar nu trebuie să se comporte conform descrierierii.
trebuie (must)
Documentele care se conformează și procesoarele trebuie să se comporte conform descrierii; altfel vor da o eroare.
eroare (error)
O violare a regulilor din această specificație; rezultatele sunt nedefinite. Software-ul specific poate să detecteze și să raporteze aceste erori și poate să le soluționeze.
eroare fatală (fatal error)
O eroare pe care un procesor XML specific trebuie să o detecteze și să o raporteze aplicației. După întâlnirea unei astfel de erori, procesorul poate continua căutarea unor astfel de erori și poate să le raporteze aplicației. În loc să proceseze erorile procesorul poate face disponibilă  aplicației informația din document, sub formă neprocesată (cu toate datele caracter și cu marcaje). Oricum, odată ce o eroare fatală a fost descoperită, procesorul trebuie să nu mai continuie procesarea normală. (de exemplu nu mai trebuie să-i furnizeze aplicației în continuare datele și informațiile despre structura logică a documentului).
la cererea utilizatorului (to the user option)
Software-ul specializat poate sau trebuie (depinde de verbul modal din propoziție) să se comporte conform descrierii; dacă o fac, atunci ele trebuie să le furnizeze utilizatorilor posibilitatea de a permite sau nu comportamentul respectiv.
cosntrângere de validitate (validity constraint)
O regulă care se aplică tuturor documentelor XML valide. Violarea acestor constrângeri de validitate sunt erori; ele trebuie, la cererea utilizatorului, să fie raportate de câtre procesoarele XML ce fac și validare.
cânstrângere pentru documentele bine formate (well-formedness constraint)
O regulă care se aplică tuturor documentelor XML bine formate. Violarea acestor constrângeri sunt erori fatale.
potrivire (match)
(A numelor și a șirurilor:) Două șiruri sau nume ce sunt comparate trebuie să fie identice. Caracterele cu mai multe reprezentări posibile în ISO/IEC 10646 (de exemplu caracterele cu formă atât precompusă cât și bayă+diacritică) se potrivesc numai dacă au aceiași reprezentare în ambele șiruri. La cererea utilizatorului, procesoarele pot normaliza asemenea caractere la anumite forme canonice. Nu se fac nici un fel de convertiri de mărimi ale caracterelor. (A șirurilor și regulilor din gramatică:) Un șir se potrivește cu o producție gramaticală dacă aparține limbajului gramaticii generate de acea poducție. (A conținutului și a modelelor de conținut:) Un element se potivește cu declararea lui când se conformează cu modelul descris în constrângerea din Secțiunea 3: Element Valid.
pentru compatibilitate (for compatibility)
O facilitate a XML inclusă doar pentru a asigura faptul că XML-ul rămâne compatibil cu SGML-ul.
pentru interoperabilitate (for interoperability)
O recomandare inclusă pentru a crește șansele ca documentele XML să poată fi procesate de pocesoarele existente de SGML, ce se supun la WebSGML Adaption Annex to ISO 8879.

2. Documentele

Un obiect de tip dată este un document XML dacă este bine format, după specificațiile acestui document. Un document poate fi și valid, pe deasupra, dacă mai îndeplinește câteva constângeri în plus.

Fiecare document are atât o structură logică cât și una fizică. Fizic, documentul este compus din unități numite entități. O entitate poate face referințe la alte entități pentru a cauza includerea lor în document. Un document începe într-o rădăcină sau o entitate document. Logic, documentul este compus din declarații, elemente, comentarii, referințe la caractere și instrucțiuni de procesare, toate fiind indicate în document prin marcaje explicite. Structura fizică și cea logică trebuie să se îmbine corect, după cum este descris în Secțiunea 4.3.2: Entități parsate bine formate.

2.1 Documente XML bine formate

Un obiect de tip text este un document XML bine format dacă:
  1. Luat ca și întreg, se potrivește cu producția numită document.
  2. Îndeplinește toate constrângerile pentru documentele bine formate date în această specificație.
  3. Fiecare entitate parsată ce este referită direct sau indirect în document este bine formată.
 
Document 
[1] document   ::= prolog element Misc*
 
Potrivirea cu producția document semnifică:
  1. Conține unul sau mai multe documente.
  2. Este un singur element numit rădăcină (root), sau element document, a cărui parte nu va apare in conținutul altui element. Pentru toate celelalte elemente, dacă marcajul de început este în conținutul altui element, marcajul de sfârșit trebuie să fie în același element. Mai simplu spus, elementele delimitate de marcaje tebuie să coexiste unul în celălalt.
Ca și consecință a acestui lucru, pentru fiecare element C care nu este rădăcină în document, există un alt element P în document, astfel încât C să fie conținut de acesta, dar nu în conținutul nici unui alt element care este și el în conținutul lui P. P este numit părintele (parent) lui C, iar C este copilul (child) lui P.

2.2 Caracterele

O entitate parsată conține text, o secvență de caractere, ce pot reprezenta un marcaj sau o dată caracter. Un caracter este un unitate atom al unui text, după cum spun specificațiile ISO/IEC 10646 [ISO 10646]. Caracterele legale sunt tab, enter (CR), sfârșit de linie LF și caracterele legale ale Unicode și ISO/IEC 10646. Utilizarea "caracterelor compatibile", definite în secțiunea 6.8 a [Unicode], este descurajată.
 
Gama Caracterelor (Character Range)
[2] Char   ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /*orice caracter Unicode, excluzând blocurile FFFE și FFFF. */
 
Mecanismul pentru codificarea valorilor caracterelor în secvențe de biți poate varia de la entitate la entitate. Toate procesoarele XML trebuie să accepte codificările UTF-8 și UTF-16 ale lui 10646; mecanismul pentru recunoașterea a cărui dintre cele două este utilizat sau pentru a intoduce și alte codificări, este discutat mai târziu în Secțiunea 4.3.3: Codificarea caracterelor în entități.

2.3 Constructori sintactici comuni

Această secțiune definește câteva simboluri utilizate frecvent în gramatică.

S (spațiu alb) constă din unul sau mai multe caractere spațiu (#x20), enter, sfârșit de linie sau tab-uri.
 
Spațiu alb (White Space)
[3]  ::= (#x20 | #x9 | #xD | #xA )+
 
Caracterele sunt clasificate pentru simplitate în litere, cifre sau alte caractere. Literele constau în caracter dintr-un alfabet sau o un caracter da bază a unei silabe, urmată probabil de unul sau mai multe caractere combinate sau de un caracter ideografic. Întreaga definiție a caracterelor specifice din fiecare clasă este dată în Anexa B: Clase de caractere.

Un nume (Name) este un cuvânt ce începe cu o literă sau cu unul dintre puținele caractere de punctuație. El poate continua cu litere, cifre, cratime, liniuțe de subliniere, două puncte sau cu puncte, toate cunoscute ca și caractere pentru nume. Numele ce încep cu șirul "xml" sau cu alte șiruri ce se potrivesc cu (('X' | 'x') ('M' | 'm') ('L' | 'l')) sunt rezervate pentru standardizare în următoarele versiuni ale acestei specificații.

NOTĂ: Caracterul două puncte din numele XML este rezevat pentru experiment ca și spații între nume. Înțelesul lui, se așteaptă să devină standardizat undeva în viitor, punct în care acele documente care le utilizează în scop experimental vor trebui reactualizate. (Nu este nici o garanție că că orice mecanism de spații între nume adoptat pentru XML va utiliza două puncte ca și delimitator între nume.) În practică, acest lucru semnifică că autorii nu ar trebui să utilizeze două puncte în numele XML, excepție făcând acele documente utilizate pentru experimentarea spațiilor dintre nume, dar procesoarele XML ar trebui să accepte două puncte ca și caracter din nume.
Un cuvânt nume (Nmtoken) este un mixaj dintre mai multe caractere pentru nume.
 
Nume și cuvinte (Names and Tokens)
[4] NameChar   ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
[5]
Name 
 ::= (Letter | '_' | ':' ) (NameChar)*
[6]
Names 
 ::= Name (S Name)*
[7]
Nmtoken 
 ::= (NameChar)+
[8]
Nmtokens 
 ::= Nmtoken (S Nmtoken)*
 
Datele literale sunt orice șir de caractere cuprins între ghilimele ce nu conține în el același tip de ghilimele ca și delimitatori pentru acel șir. Literali sunt utilizați pentru a specifica conținutul entitățiilor interne (EntityValue), valorile unror atribute (AttValue) și identificatori externi (SystemLiteral). De menționat că peste un literal system (SystemLiteral) se poate trace fără a mai fi necesară o parsare.
 
Literali (Literals)
[9] EntityValue   ::= '"' ([^%&"] | PEReference | Reference )* '"' | "'" ([^%&'] | PEReference | Reference)* "'"
[10]
AttValue 
 ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'"
[11]
SystemLiteral 
 ::= ('"' [^"]* '"' | ('" [^']* "'")
[12]
PubidLiteral 
 ::= '"' PubidChar* '"' | "'" | "'" (PubidChar - "'")* "'"
[13]
PubidChar 
 ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

2.4 Datele caracter și marcajele

Textul constă din îmbinarea dintre date caracter și marcaje. Marcajul (markup) ia una dintre formele: macaje de început, marcaje de sfârșit, marcaje pentru elemente goale, referințe la entirăți, referințe la caractere, comentarii, delimitatori de secțiuni CDATA, declarații de tipuri de document și instrucțiuni de procesare.

Tot textul care nu face parte dintr-un marcaj reprezintă datele caracter (character data) ale documentului.

Caracterul and (&) și paranteza unghiulară deschisă (<) pot apărea în forma lor literală numai atunci când este utilizat ca și delimitator de marcaj sau într-un comentariu, o instrucțiune de procesare sau o secțiune CDATA. Ele sunt, de asemenea, legale între valorile entitățiilor literale a unei declarații de entitate internă; vezi Secțiunea 4.3.2: Entități parsate bine formate. Dacă este nevoie de ele în altă parte, ele vor trebui să fie incluse utilizându-se fie referințele numerice la caractere sau șirurile "&amp;" și respectiv "&lt;". Paranteza unghiulară închisă (>) poate fi reprezentată utilizând șirul "&gt;" și trebuie, pentru compatibilitate, să fie inclusă utilizând "&gt;" sau o referință la caracter atunci când ea apare în șirul "]]>", când șirul nu delimitează o secțiune CDATA.

În conținutul elementelor, datele caracter sunt orice șir de caractere ce nu conține delimitatorul de început al unui marcaj. Într-o secțiune CDATA, datele caracter sunt orice șir de caractere ce nu include delimitatorul de sfârșit al secțiuni CDATA, "]]>".

Pentru a permite valorilor atributelor să conțină atât apostroafe simple cât și duble, caracterul apostrof sau ghilimeaua (') trebuie să fie reprezentată ca și "&apos;", iar caracterul ghilimele (") ca și "&quot;".
 
Dată caracter (Character Data) 
[14] CharData   ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

2.5 Comentariile

Comentarile pot apărea oriunde în document în afara altor marcaje; în plus ele pot apare în declarația tipului de fișier în locurile permise de gramatică. Ele nu fac parte din datele caracter ale documentului; un procesor XML poate, dar nu este nevoie, să dea un acces aplicațiilor la comentarii. Pentru compatibilitate, șirul "--" (liniuță dublă) nu trebuie să apară în comentarii.
 
Comentarii (Coments)
[15] Comment   ::= ' <! --' ((Char - '-' ) | ( '-' (Char - '-')))* '-->'
 
Un exemplu de comentariu:
 
<!-- decalarations for <head> & <body> -->

2.6 Instrucțiuni de procesare

Instrucțiunile de procesare (processing instructions - PI) permit documentelor să conțină instrucțiuni pentru aplicații.
 
Instrucțiuni de procesare (Processing Instructions)
[16] PI   ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
[17]  PITarget   ::= Name - (( 'X' | 'x' ) ( 'M' | 'm' ) ( 'L' | 'l' ))
 
Instrucțiunile de procesare nu sunt părți ale datelor caracter, dar trebuie trimise aplicației. Instrucțiunile de procesare încep cu o țintă (PITarget) utilizată pentru a identifica aplicația căreia îi este destinată instrucțiunea. Numele de ținte de forma 'XML', 'xml' sau alte combinații posibile, sunt rezervate pentru standardizare în această versiunea sau pentru versiuni ulterioare. Mecanismul de notații al XML poate fi utilizat pentru declarații formale ale unor ținte PI.

2.7 Secțiunile CDATA

Secțiunile CDATA (CDATA sections) pot apărea oriunde pot apărea și datele caracter; ele sunt utilizate pentru a include blocuri de text ce conțin caractere ce ar fi altfel recunoscute ca și marcaje. Secțiunile CDATA încep cu șirul "<!CDATA[" și se termină cu șirul "]]>":
 
Secțiunile CDATA (CDATA Sections)
[18]  CDSect   ::= CDStart CData CDEnd 
[19]  CDStart   ::= '<![CDATA['
[20] CData   ::= (Char* - (Char* ']]>' Char*))
[21] CDEnd   ::= ']]>'
 
Într-o secțiune CDATA, numai șirul CDEnd este recunoscut ca și marcaj, deci parantezele unghiulare dreapte și and-urile pot apărea în forma lor literală; nu este nevoie (și nu trebuie) să fie incluse utilizând "&lt;" și "&amp;". Secțiunile CDATA nu pot fi incluse una în alta.

Un exemplu a unei secțiuni CDATA, în care "<greeting>" și "</greeting>" sunt recunoscute ca și date caracter și nu ca marcaje:
 
<![CDATA[<greeting>Hello World!</greeting>]]>

2.8 Prologul și Declararea Tipului de Document

Documentele XML pot și ar trebui să înceapă cu o declarație XML (XML declaration) care specifică versiunea limbajului XML utilizat. De exemplu, următorul exemplu este un document XML bine format, dar care nu este valid:
 
<?xml version="1.0"?> 
<greeting>Hello, world!</greeting>
 
la fel este și:
 
<greeting>Hello, world!</greeting>
 
Numărul versiunii "1.0" ar trebui să fie utilizat pentru a indica conformarea la această versiune de specificații; este o eroare dacă se utilizează versiunea "1.0" dacă nu se conformează la această versiune de specificații. Intenția grupului de lucru XML este de a da următoarelor veriuni de specificații alte numere diferite de "1.0", dar această intenție nu indică o obligație de a produce versiuni ulterioare ale XML și nici dacă acestea vor fi produse, utilizarea unei anumite scheme de numere. Odată ce la versiunile următoare nu se lucrează, această construcție este furnizată pentru a permite recunoașterea automată a versiuni și ar trebui să devină necesară. Procesoarele pot semnala o eroare dacă primesc documente cu versiuni pe care nu le suportă.

Funcția unui marcaj într-un document XML, este de a descrie ceea ce conține și structura logică și pentru a asocia perechi de atribute-valori la structura lui logică. XML furnizează un mecanism, numit declarația tipului de document, pentru a defini constrângeri pe structura logică și pentru a suporta unități de stocare predefinite. Un document XML este valid dacă are asociată o declarație de tip de document și dacă documentul este conform constrângerilor din ea.

Declarația tipului de document trebuie să apară înaintea primului element din document.
 
Prologul (Prolog)
[22] polog   ::= XMLDecl? Misc* (doctypedecl Misc*)?
[23]
XMLDecl 
  ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>')
[24]
VersionInfo 
 ::= S 'version' Eq ( 'VesionNum' | "VersionNum")
[25]
Eq 
 ::= S? '=' S?
[26]
VersionNum 
 ::=([a-zA-Z0-9_.:] | '-')+
[27] Misc   ::= Comment | PI | S
 
Declarația tipului de document XML (document type declaration) conține sau indică spre declarațile de marcaje ce furnizează a o gramatică pentru o clasă de documente. Această gramatică este cunoscută sub numele de definiția tipului de document sau DTD. Declarația tipului de document poate indica spre un subset extern (un tip special de entitate externă) ce conține declarații de marcaje sau poate conține declarații de marcaje direct într-un subset intern sau în ambele părți. DTD-ul unui document este format din ambele subseturi luate împreună.

Declarația unui marcaj (markup declaration) este o declarare a unui tip de element, o declarare a unei liste de atribute, declararea unei entități sau a unei declarații de notație. Toate aceste declarații pot fi conținute în întregime sau numai o parte dintre ele între entitățiile parametru, după cum sunt descrise în censtrângerile documentelor bine formate și valide. Pentru mai multe informații vezi Secțiunea 4: Structuri fizice.
 
Definiția tipului de document (Document Type Definition)
[28] doctypedecl   ::= '<!DOCTYPE' S Name (S ExternalID)? S? ( ' [ ' (markupdecl | PEReference | S)* ']' S?)? '>' [VC: Tipul elementului rădăcină]
[29]  markupdecl   ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [VC: Declarație/ Includerea entitățiilor parametru propice] 
[WFC: Entitățile parametru din subsetul intern]
 
Declarația marcajului poate fi în întregime sau numai în parte formată din textul de înlocuit de la entitățiile parametru. În producțiile de mai târziu din această specificație referitoare la nonterminali individuali, sunt descrise declarațiile după ce toate entitățiile parametru au fost incluse.

VC (Constrângere de validitate): Tipul de element rădăcină. Numele (Name) în declarația tipului de document trebuie să se potrivească cu tipul elementului rădăcină.
VC (Constrângere de validitate):  Declarație/ Includerea entitățiilor parametru propice. Textul de înlocuit al entității parametru  trebuie să fie inclus propice în declarația de marcaj. Altfel spus, dacă primul caracter sau ultimul caracter al unei declarații de marcaj (markupdecl mai sus) este conținut în textul de înlocuit pentru referința la o entitate parametru, ambele trebuie să fie conținute în același text de înlocuit.
WFC (Constrângere de document bine format): Entitățile parametru din subsetul intern. În subsetul intern al DTD-ului, referințele la entitățile parametru pot apare numai unde pot apare și declarațile de marcaje. (Aceasta nu se aplică la referințele ce apar în entitățiile parametru externe sau în subsetul extern.)
Ca și subsetul intern, subsetul extern și orice entitate parametru externă referită în DTD trebuie să conste dintr-o serie de declarații de marcaje complete al tipurilor permise de simboli neterminali markupdecl, întrețesute cu spații albe sau referințe entitate parametru. Oricum, porțiuni ale conținutului al subsetului extern sau al entităților parametru externe pot fi condițional ignorate, prin utilizarea construcției de secțiuni condiționale; acest lucru nu este permis în subsetul intern.
 
Subsetul Extern (Extern Subset)
[30] extSubset   ::= TextDecl? extSubsetDecl
[31] extSubsetDecl   ::= (markupdecl | conditionalSect | PEReference | S)*
 
Subsetul extern și entitățile parametru externe diferă, de asemenea, de subsetul intern, prin faptul că în ele referințele entitate parametru sunt permise în declarațiile de marcaje, nu numai între declarațiile de marcaje.

Un exemplu de document XML cu o declarație de tip de document:
 
<?xml version="1.0"?> 
<!DOCTYPE greeting SYSTEM "hello.dtd"> 
<greeting>Hello World!</greeting> 
 
Identificatorul sistem "hello.dtd" este URI-ul unui DTD al unui document.

Declarațiile pot fi date și local ca în exemplul de mai jos:
 
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE greeting [ 
    <!ELEMENT greeting (#PCDATA)> 
]> 
<greeting>Hello World!</greeting> 
 
Dacă sunt utilizate ambele subseturi, atât cele externe, cât și cele interne, se consideră că subsetul intern va apare înaintea subsetului extern. Aceasta va avea ca și efect faptul că declarațiile entitatăților și a listelor de atribute în subsetul intern vor avea o precedență față de cele din subsetul extern.

2.9 Declarația documentului independent

Declarațile de marcaje pot afecta conținutul documentului, imediat ce sunt transmise de la procesorul XML către aplicație; exemple sunt atributele implicite și declarațile de entități. Declararația decumentului independent ce poate apărea ca și componentă în declarația XML, semnalează dacă există sau nu astfel de declarații ce apar ca și externe față de entitatea document.
 
Declarația documentului independent (Stanalone Document Declaration)
[32] SDDecl   ::= S 'standalone' Eq (( "'" ( 'yes' | 'no' ) "'") | ( '"' ( 'yes' | 'no' ) '"')) [VC: Declarația documentului independent]
 
În declarația documentului independent, valoarea "yes" indică faptul că nu există declarații de marcaje externe față de entitatea document (nici în subsetul extern al DTD-ului sau în entitățile parametru externe, referite din subsetul intern) ce vor afecta informația transmisă de la procesorul XML către aplicație. Valoarea "no" indică faptul că sunt sau pot fi asemenea declarații de marcaje externe. De menționat că declarația de document independent indică numai faptul că sunt declarații externe; prezența, în document, a referințelor spre entitățiile externe, când aceste entități sunt declarate intern, nu schimbă statutul de independență.

Dacă nu există declarații de marcaje externe, declarația documentului indpendent nu are sens. Dacă există declarații de marcaje externe, dar nu există declararea documentului independent este asociată automat valoarea "no".

Un document XML pentru care standalone="no" poate fi convertit printr-un algoritm într-un document independent, ce poate fi cerut de anumite aplicații de livrare prin rețea.
 

VC (Constrângere de validitate): Declarația documentului independent. Declarația documentului independent trebuie să posede valoarea "no" dacă orice declarație de marcaj externă conține declarații ale:
Un exemplu de declarație XML cu o declarare de document independent:
 
<?xml version="1.0" standalone='yes' ?>

 2.10 Tratarea spațiilor albe

În editarea documentelor XML, este adesea convenabil să fie utilizate "spații albe" (spații, taburi și linii goale notate toate cu nonterminalul S în această specificație) pentru a separa marcajele pentru a crește claritatea la citire. Asemenea spații albe nu se intenționează a fi incluse în versiunea trimisă a documentului. Pe de altă parte, "spațiile albe" semnificante ce trebuie reținute în versiunea expediată sunt comune, de exemplu într-o poezie sau în cod sursă.

Un procesor XML trebuie întotdeauna să trimită toate caracterele ce nu sunt marcaje spre aplicație. Un procesor XML validator trebuie să informeze aplicația care dintre aceste caractere constituie spații albe ce apar în conținutul unui element.

Un atribut special numit "xml:space" poate fi atașat unui element pentru a semnala o intenție că în acel element, spațiile albe ar trebui păstrate de către aplicație. În documentele valide, acest atribut, ca și celelalte trebuie să fie daclarat dacă este utilizat. Când este declarat, trebuie dat ca și tip enumerație, a cărui valori posibile sunt "default" și "preserve". De exemplu:
 
<!ATTLIST poem xml:space (default | preserve) 'preserve'> 
 
Valoarea "default" semnalează că modurile de procesare implicite ale spațiilor albe ale aplicațiilor sunt acceptabile pentru acest document; valoarea "preserve" indică intenția ca aplicația să păstreze toate spațiile albe. Această intenție declarată se consideră că se aplică la toate elementele din conținutul elementelor în care a fost specificată, mai puțin acolo unde a fost suprascrisă cu o altă instanță a atributului "xml:space".

Elementul rădăcină al oricărui document se consideră că nu are nici o intenție în ceea ce privește manipularea spațiilor de către aplicație, mai puțin atunci când furnizează o valoare a acestui atribut sau când atributul este declarat cu o valoare implicită.

2.11 Tratarea sfâșiturilor de linie

Entitățiile parsate XML sunt stocate adesea în fișiere care, pentru ușurința editării, sunt organizate în linii. Aceste linii sunt separate de câteva combinații ale caracterelor enter CR (#xD) și sfârșit de linie LF (#xA).

Pentru a simplifica munca aplicaților, oricând o entitate parsată externă sau valoarea entitate literală a unei entități parsate internă  conține fie combinația literală de două caractere "#xD#xA" sau literalul independent #xD, procesorul trebuie să-i transmită aplicației numai caracterul #xA. (Acest comportament poate fi produs cu ușurință prin conversia tuturor sfârșiturilor de linii în caracterul #xA, la intrare, înainte de parsare.)

2.12 Identificarea limbajului

În procesarea documentului, este adesea util să identificăm natura limbajului formal în care este scris conținutul. Un atribut special numit "xml:lang" poate fi inserat în document pentru a specifica limbajul utilizat în conținut și în valorile atributelor oricărui element din documentul XML. În documentele valide, acest atribut, ca și oricare altul, trebuie declarat înainte de a fi utilizat. Valorile atributului sunt identificatori de limbaj precum sunt definiți de către [IETF RFC 1766], "Tags for the Indentification of Languages":
 
Identificarea Limbajului (Language Identification)
[33] LanguageID   ::= Langcode ('-' Subcode)*
[34]
Langcode 
 ::= ISO639Code | IanaCode | UserCode
[35]
ISO639Code 
 ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])
[36]
IanaCode 
 ::= ('i' | 'I') '-' ([a-z] | [A-Z])+
[37]
UserCode 
 ::= ('x' | 'X') '-' ([a-z] | [A-Z])+
[38] Subcode   ::= ([a-z] | [A-Z])+
 
Codul limbajului (Langcode) poate fi unul dintre următoarele: Pot fi oricâte segmente de subcod (Subcode); dacă primul segment de subcod există și dacă Subcode are două litere, atunci trebuie să fie un nume de țară din [ISO3166], "Codes for the representation of names of countries." Dacă primul subcod are mai mult de două litere, trebuie să fie un subcod pentru limba în discuție, înregistrată cu IANA, excepție fiind atunci când codul imbajului (Langcode) începe cu prefixul "x-" sau "X-".

Este un obicei să se dea codul limbajului cu litere mici și codul țării (dacă există) cu litere mari. De menționat că aceste valori, spre deosebire de alte nume în documentele XML, nu sunt senzitive la mărimea literelor.

De exemplu:
 
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p> 
<p xml:lang="en-GB">What colour is it?</p> 
<p xml:lang="en-US">What color is it?</p> 
<sp who="Faust" desc='leise' xml:lang="de"> 
    <l>Habe nun, ach! Philosophie,</l> 
    <l>Juristerei, und Medizin</l> 
    <l>und leider auch Theologie</l> 
   <l>durchaus studiert mit heißem Bemüh'n.</l> 
</sp>
 
Intenția declarată cu "xml:lang" se consideră că se aplică la toate atributele și la conținutul elementelor în care este specificat, mai puțin atunci când este suprascrisă cu o altă instanță a xml:lang de către un alt element din acel conținut.

O simplă declarație xml:lang poate lua forma:
 
xml:lang NMTOKEN #IMPLIED
 
dar valori specifice implicite pot fi deasemenea date, dacă este adecvat. Într-o colecție de poezii franceze pentru studenți englezi, cu glosă și notițe în engleză, atributul xml:lang poate fi declarat astfel:
 
<!ATTLIST poem xml:lang NMTOKEN 'fr'> 
<!ATTLIST gloss xml:lang NMTOKEN 'en'> 
<!ATTLIST note xml:lang NMTOKEN 'en'>
 

3. Structuri logice

Fiecare document XML conține unul sau mai multe elemente ce sunt delimitate, fie de marcaje de start și de sfârșit, fie, în cazul elementelor goale, de marcaje pentru elemente goale. Fiecare element are un tip, identificat prin nume, de mult ori numit "identificatorul său generic" (GI), și poate avea un set de specificații de atribute. Fiecare specificație de atribut are un nume și o valoare.
 
Element
[39] element   ::= EmptyElemTag | STag content ETag [WFC: Potrivirea tipului elementului] 
[VC: Validitatea elementului]
 
Această specificație nu conține sementica, utilizarea sau (în spatele sintaxei) numele tipurilor de elemente și atributele, exeptând acele nume care încep cu un șir care se potrivește cu (( 'X' | 'x' )( 'M' | 'm' )( 'L' | 'l' )), ce sunt rezervate pentru standardizare în această versiune sau în versiunile viitoare ale acestei specificații.
WFC (Contrângere pentru documente bine formate): Potrivirea tipului elementului. Numele (Name) din marcajul de la sfârșitul elementului trebuie să se potrivească cu tipul elementului din marcajul de la început.
VC (Constrângere de validitate): Validitatea elementului. Un element este valid dacă există o declarație ce se potrivește cu elementdecl unde numele (Name) se potrivește cu tipul elementului și se întâmplă una dintre următoarele situații:
  1. Declarația se potrivește cu EMPTY și elementul nu are conținut.
  2. Declarația se potrivește cu children, iar secvența de elemente copil aparține limbajului generat de expresia normală din modelul conținutului, cu spații albe opționale (caractere ce se potrivesc cu nonterminalul S) între fiecare pereche de elemente copil.
  3. Declarația se potrivește cu Mixed, iar conținutul constă din date caracter și elemente copil a căror tipuri se potrivesc cu nume din modelul conținutului.
  4. Declarația se potrivește cu ANY, și tipurile oricărui element copil au fost declarate.

3.1 Marcajele de început, marcajele de sfârșit și marcajele elmentelor goale

Începutul oricărui element XML ce nu este gol, este marcat printr-un marcaj de început (start-tag).
 
Marcaj de început (Start-Tag)
[40] STag   ::= '<' Name (S Attribute)* S? '>' [WFC: Specificație pentru unicitatea unui atribut]
[41] Attribute   ::= Name Eq AttValue [VC: Tipul valorii atributului] 
[WFC: Fără referințe la entități externe] 
[WFC: Fără < în valoarea atributelor]
 
Numele (Name) din marcajul de început și din marcajul de sfârșit dau tipul elementului. Perechile Name-AttValue sunt denumite și specificațiile de atribute ale elementului, cu numele (Name) din fiecare pereche referind numele atributului și conținutul din AttValue (textul dintre delimitatorii ' sau ") ca și valoarea atributului.
WFC (Constrângere pentru documentele bine formate): Specificație pentru unicitatea unui atribut. Nici un nume de atribut nu poate apărea de mai multe ori în în același marcaj de început sau în același marcaj al unui element gol.
VC (Constrângere de validitate): Tipul valorii atributului. Atributul trebuie să fi fost declarat; valoarea trebuie să fie de tipul celei declarate pentru atribut. Pentru tipurile atributelor vezi Secțiunea 3.3: Declarațile listelor de atribute)
WFC (Constrângere pentru documentele bine formate): Fără referințe la entități externe. Valorile atributelor nu pot conține referințe directe sau indirecte spre entități externe.
WFC (Constrângere pentru documentele bine formate): Fără < în valoarea atributelor. Textul de înlocuit al oricărei entități referite direct sau indirect în valoarea atributului (altul decât "&lt;"), nu poate conține caracterul <.
Un exemplu de marcaj de început:
 
<termdef id="dt-dog" term="dog">
 
Sfârșitul oricărui element ce începe cu un marcaj de început trebuie să fie marcat de un marcaj de sfârșit conținând un nume ce este ecoul tipului de element dat în marcajul de început:
 
Marcaj de sfârșit (End-tag)
[42] ETag   ::= '</' Name S? '>'
 
Un exemplu de marcaj de sfârșit:
 
</termdef>
 
Textul dintre marcajul de început și marcajul de sfârșit este numit conținutul elementului:
 
Conținutul elementelor (Content of Elements)
[43] content   ::= (element | CharData | Reference | CDSect | PI | Comment)* 
 
Dacă un element este gol, el trebuie reprezentat fie de un marcaj de început urmat imediat de un marcaj de sfârșit, fie de un marcaj de element gol. Un marcaj pentru un element gol ia o formă specială:
 
Marcaje pentru elementele goale (Tags for Empty Elements)
[44] EmptyElemTag   ::= '<' Name (S Attribute)* S? '/>' [WFC: Specificație pentru unicitatea unui atribut]
 
Marcajele pentru elementele goale pot fi utilizate de orice element ce nu are conținut, dacă este sau nu declarat utilizând cuvântul cheie EMPTY. Pentru interoperabilitate, marcajul pentru un element gol trebuie utilizat, și poate fi utilizat numai pentru elemente care sunt declarare EMPTY.

Exemple de elemente goale:
 
<IMG align="left" 
src="http://www.w3.org/Icons/WWW/wc3_home"> 
<br></br> 
<br/>

 3.2 Declarațiile tipurilor de elemente

Structura elementelor dintr-un document XML poate, din motive de validare, fi constrânsă utilizând tipurile de elemente și declarațiile listelor de atribute. O declarație a unui tip de element aplică constrângeri asupra conținutului unui element.
 
Declarațiile tipurilor de elemente constrânge de multe ori tipurile de elemente pot apare ca și copii ai elementelor. La cererea utilizatorului, un procesor XML poate genera o atenționare, când o declarație menționează un tip de element pentru care nu este dată nici o declarație, dar acest lucru nu este o eroare.

Declarația tipului unui element (element type declaration) ia forma:
 
Declarațiile tipurilor de elemente (Element Type Declaration)
[45] elementdecl   ::= '<!ELEMENT' S Name S contentspec S? '>' [VC: Declarație de tip de element unică]
[46] contentspec   ::='EMPTY' | 'ANY' | Mixed | children
 
unde numele (Name) indică tipul elementului ce va fi declarat.

Validity Constraint (Constrângere de validitate): Declarație de tip de element unică. Nici un element nu poate fi declarat de mai multe ori.
Exemple de declarații de tipuri de elemente:
 
<!ELEMENT br EMPTY> 
<!ELEMENT p (#PCDATA|emph)*> 
<!ELEMENT %name.para; %content.para;> 
<!ELEMENT container ANY> 

3.2.1 Conținutul unui element

Un tip de element are un conținut de element (element content) atunci când elementele acelui tip trebuie să conțină numai elemente copil (nu date caracter), separate opțional de spații albe (caractere ce se potrivesc cu nonterminalul S). În acest caz, constrângerile includ un model al conținutului, o gramatică simplă ce guvernează tipurile de elemente copil permise și ordinea în care este permisă apariția lor. Gramatica este construită pe particule de conținut (cps), care constau din nume, liste din care se alege conținutul particulelor sau liste de secvențe ale conținutului particulelor:
 
Modele al conținutului elementelor (Element-content Models)
[47]  children   ::= (choise | seq) ('?' | '*' | '+')?  
[48]  cp   ::= (Name | choise | seq) ( '?' | '*' |'+')?  
[49] choise   ::= '(' S? cp ( S? '|' S? cp )* S? ')' [VC: Grup/Includerea entităților parametru propice]
[50] seq   ::= '(' S? cp ( S? ',' S? cp )* S? ')' [VC: Grup/Includerea entităților parametru propice]
 
unde fiecare nume (Name) este tipul unui element ce poate apare ca și copil. Orice particulă de conțiunut dintr-o listă de opțiuni poate apare în conținutul unui element la locația unde lista de opțiuni apare în gramatică; fiecare dintre particulele de conținut ce apar în lista secvențială trebuie să apară în conținutul elementului în ordinea dată în listă. Caracterul opțional ce urmează după un nume sau o listă, dictează dacă elementul sau particulele conținut din listă pot apărea o dată sau de mai multe ori (+), niciodată sau de mai multe ori (*), niciodată sau o dată (?). Absența unui astfel de operator, înseamnă că elementul sau particula de conținut trebuie să apară exact o dată. Această sintaxă și semnificație este identică cu cea utilizată în producțiile din această specificație.

Conținutul unui element se potrivește cu un model de conținut, dacă și numai dacă este posibil să se extragă o cale prin modelul conținutului, conformându-se operatorilor ce impun secvența, alegera și repețiția și dacă fiecare element din conținut se potrivește cu un element din modelul conținutului. Pentru compatibilitate, este o eroare dacă un element din document se potrivește cu mai mule instanțe a unui tip de element din modelul de conținut. Pentru mai multe informații, vezi Anexa E: Modele de conținut deterministice.

VC(Constrângere de validitate): Grup/Includerea entităților parametru propice. Textele de înlocuit ale entităților parametru trebuie să se potrivescă cu grupurile parametrizate. Cu alte cuvinte, dacă una dintre parantezele deschise sau închise dintr-o alegere (choise), secvență (seq) sau mixaj (Mixed), este conținută într-un text de înlocuit pentru o entitate parametu, atunci și perechea ei trebuie să fie conținută în același text de înlocuit.
Pentru interoperabilitate, dacă o referință la o entitate parametru apare într-o alegere (choise), secvență (seq) sau mixaj (Mixed), textul ei de înlocuit nu trebuie să fie gol și nici primul sau ultimul caracter non-spațiu nu trebuie să fie un conector (| sau ,).
Exemple de modele de conținut:
 
<!ELEMENT spec (font, body, back?)> 
<!ELEMENT div1 (head, (p | list | note)*, div2)> 
<!ELEMENT dictionary-body (%div.mix; | %dict.mix; )*>

3.2.2 Conținut mixat

Un tip de element are un conținut mixat (mixed content) dacă elementele acelui tip pot conține date caracter, intersectate opțional cu elemente copil. În acest caz, tipurile elementelor copil pot fi constrânse, dar nu și numărul lor sau numărul apariților lor:
 
Declarație de conținut mixat (Mixed-content Declaration)
[51] Mixed   ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' [VC: Grup/Includerea entităților parametru propice] 
[VC: Fără tipuri duplicate]
 
unde numele (Names) dau tipurile de elemente ce pot apărea ca și copil.
VC (Constrângere de validitate): Fără tipuri duplicate. Același nume nu trebuie să apară de mai multe ori într-un singur conținut mixat.
Exemple de declarații de conținut mixat:
 
 
<!ELEMENT p (#PCDATA | a | ul | b | i | el)*> 
<!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form; )*> 
<!ELEMENT p (#PCDATA)> 

3.3 Declarațiile listelor de atribute

Atributele sunt utilizate pentru a asocia elementelor perechi de nume și valorii. Specificațiile atributelor pot să apară numai în marcajele de început și în marcajele de elemente goale; astfel, producțiile utilizate pentru a le recunoșate apar în Secțiunea 3.1 Marcajele de început, marcajele de sfârșit și marcajele elmentelor goale. Declarațiile listelor de atribute pot fi utilizate: Declarațiile listei de atribute (attribute-list declarations) specifică numele, tipul și valoarea implicită (dacă există) a fiecărui atribut asociat cu un tip de element:
 
Declararea listei de atribute (Atribute-list declaration)
[52] AttlistDecl   ::= '<!ATTLIST' S Name AttDef* S? '>'
[53] AttDef   ::= S Name S AttType S DefaultDecl
 
Numele (Name) din regula listei de atribute (AttlistDecl) specifică tipul unui element. La cererea utilizatorului, un procesor XML poate genera o ateționare dacă atributele sunt declarate pentru un tip ce nu a fost declarat, dar acest lucru nu este o eroare. Numele (Name) din regula definiției atributului (AttDef) specifică numele atributului.

Dacă sunt declarate mai multe liste de atribute (AttlistDecl)pentru același tip de element, conținutul tuturora este concatenat. Dacă există mai multe definiții pentru același atribut al unui tip de element, numai prima dinte este luată în considerare, celelalte fiind ignorate. Pentru interoperabilitate, cei ce scriu un DTD pot să scrie mai multe declarații de liste de atribute pentru același tip de element, cel mult o definiție pentru un nume dat de atribut și cel puțin o definiție a unui atribut în fiecare declarație a unei liste de atribute. Pentru interoperabilitate, procesorul XML poate, la cererea utilizatorului, să genereze o atenționare atunci când pentru un tip de element sunt date mai multe declarații de liste de atribute sau atunci când pentru un anumit atribut dat sunt date mai multe declarații de atribute, dar toate acestea nu sunt erori.

3.3.1 Tipuri de atribute

Tipurile de atribute XML sunt de trei feuri: de tip string, un set de tipuri de cuvinte și de tip enumerat. Tipul string poate lua ca și valoare orice șir literal ; tipurile de cuvinte pot avea constrângeri semantice și lexicale, după cum sunt menținate mai jos:
 
Tipuri de atribute (Atribute Types)
[54]  AttType   ::= StringType | TokenizedType | EnumeratedType   
[55]  StringType   ::= 'CDATA'  
[56] TokenizedType 
::= 'ID'  [VC: ID]
[VC: Un ID pentru un tip de element]
[VC: Atribut ID implicit]
| 'IDREF' [VC: IDREF]
| 'IDREFS' [VC: IDREF]
| 'ENTITY' [VC: Numele entității]
| 'ENTITIES' [VC: Numele entității]
| 'NMTOKEN' [VC: Numele cuvântului]
| 'NMTOKENS' [VC: Numele cuvântului]
 
 
VC (Constrângere de validitate): ID. Valorile tipului ID trebuie să se potrivească cu producția Name. Un nume nu trebuie să apară de mai multe ori într-un document XML ca și valoare a acestui tip; de exemplu, valorile ID trebuie să identifice într-un mod unic elementele de care țin.
VC (Constrângere de validitate):  Un ID pentru un tip de element. Nici un tip de element nu poate avea specificat mai mult de un atribut ID.
VC (Constrângere de validitate): IDREF. Valorile de tip IDREF trebuie să se potrivească cu producția Name și valoriile de tip IDREFS trebuie să se potrivească cu producția Names; fiecare nume (Name) trebuie să se potrivească cu valoarea unui atribut ID dintr-un element din documentul XML; de exemplu, IDREF trebuie să se potrivească cu valoarea unui atribut ID.
VC (Constrângere de validitate): Numele entității. Valorile tipului ENTITY trebuie să se potrivească cu producția Name, iar valorile de tip ENTITIES trebuie să se potrivească cu poducția Names; fiecare nume (Name) trebuie să se potrivească cu numele unei entități neparsate declarate în DTD.
VC (Constrângere de validitate): Numele cuvântului. Valorile tipului NMTOKEN trebuie să se potrivească cu producția Nmtoken; valorile tipului NMTOKENS trebuie să se potrivească cu producția Nmtokens.
Atributele enumerate (enumerated atributes) pot lua una dintre valoriile date în declarație. Există două feluri de tipuri enumerate:
 
Modele al conținutului elementelor (Element-content Models)
[57]  EnumeratedType   ::= NotationType | Enumeration  
[58]  NotationType   ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [VC: Atributele notație]
[59] Enumeration   ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [VC: Enumerare]
 
Un atribut NOTATION identifică o notație, declarată în DTD cu identificatori system și/sau publici asociați, pentru a fi utilizat în interpretarea elementului căruia îi este atașat atributul.
VC (Constrângere de validitate): Atributele notație. Valorile acestui tip trebuie să se potrivească cu unul dintre numele notaților (notation) incluse în declarație; toate numele de notații din declarație trebuie să fi fost declarate.
VC (Constrângere de validitate): Enumerare. Valorile acestui tip trebuie să se potrivească cu unul dintre cuvintele din declarația Nmtoken .
Pentru interoperabilitate, același cuvânt (Nmtoken) nu trebuie să apară de mai multe ori în tipurile de atribute enumerate ale unui singur tip de element.

3.3.2 Valoriile implicite ale atributelor

O declarație de atribut furnizează informația dacă prezența atributului este necesară, iar dacă nu, cum trebuie să reacționeze procesorul XML dacă un atribut declarat lipsește din document.
 
Valoriile implicite ale atributelor (Attribute Defaults)
[60] DefautDecl   ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) [VC: Atribut obligatoriu] 
[VC: Valoare implicită legală] 
[WFC: Fără < în valoarea atributelor] 
[VC: Valoare implicită fixă]
 
În declararea unui atribut, #REQUIRED semnifică faptul că atributul va trebui să fie furnizat întodeauna, #IMPLIED semnifică că nu este furnizată nici o valoarea implicită. Dacă în declarație, nu este dat nici #REQUIRED și nici #IMPLIED, atunci valoarea AttValue va da valoarea implicită; cuvântul cheie #FIXED stabilește faptul că întotdeauna atributul va trebui să aibă valoarea implicită. Dacă este declarată o valoare implicită, atunci când un procesor XML întâlnește un atribut omis, el va trebui să se comporte ca și cum atributul ar fi prezent și ar avea valoarea implicită.
VC (Contrângere de validitate): Atribut obligatoriu. Dacă declarația implicită conține cuvântul cheie #REQUIRED, atunci atributul va trebui specificat în toate elementele tipului respectiv în listele lor de atribute.
VC (Constrângere de validitate): Valoare implicită legală. Valoarea implicită declarată trebuie să se supună constrângerilor lexicale din declarația tipului de atribut.
VC (Constrângere de validitate): Valoare implicită fixă. Dacă un atribut are o valoare implicită declarată împreună cu cuvântul cheie #FIXED, instanțele acelui atribut trebuie să se potrivească cu valoarea implicită.
Exemple de declarații de liste de atribute:
 
<!ATTLIST termdef 
                id ID #REQUIRED 
                name CDATA #IMPLIED> 
<!ATTLIST list 
                type (bullets|ordered|glossary) "ordered"> 
<!ATTLIST form 
                method CDATA #FIXED "POST">

3.3.3 Normalizarea valoriilor atributelor

Înainte ca valoarea unui atribut să fie trecută aplicației, sau verificată pentru validare, procesorul XML trebuie să o normalizeze după cum urmează: Dacă valoarea declarată nu este CDATA, atunci procesorul XML trebuie să proceseze în continuare valoarea atributului normalizat prin eliminarea oricărui spațiu de la început sau de la sfârșit (#x20) și prin înlocuirea secvențelor de caractere spațiu (#x20) cu un singur caracter spațiu (#x20).

Toate atributele pentru care nu a fost citită nici o declarație trebuie tratate de către un parser non-validator ca și cum ar fi declarate CDATA.

3.4 Secțiunile condiționale

Secțiunile condiționale (conditional sections) sunt porțiuni din subsetul extern ale declarației tipului de document, care sunt incluse sau excluse din structura logică a unui DTD, bazate pe un cuvânt cheie care le guvernează.
 
Secțiune condițională (Conditional Section)
[61] conditionalSect   ::= includeSect | ignoreSect
[62]
includeSect 
 ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
[63]
ignoreSect 
 ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64]
ignoreSectContents 
 ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65]
Ignore 
 ::= Char* - (Char* ('<![' | ']]>') Char*)
 
Ca și subseturile DTD interne sau externe, o secțiune condițională poate conține una sau mai multe declarații complete, comentarii, instruncțiuni de procesare sau secțiuni condiționale imbricate, având printre ele spații albe.

Dacă cuvântul cheie al secțiunii este INCLUDE, atunci conținutul secțiunii condiționale este parte a DTD-ului. Dacă cuvântul cheie al secțiunii condiționale este IGNORE, atunci conținutul secțiunii condiționale nu face logic parte din DTD. De menționat că pentru o parsare corectă, trebuie citite chiar și conținutul secțiuniior condiționale ignorate, pentru a detecta secțiuniile condiționale incluse în secțiunea curentă și pentru a fi siguri că sfârșitul secțiunii ignorate, cea mai cuprinzătoare, este ales corect. Dacă o secțiune codițională ce are ca și cuvânt cheie INCLUDE, apare în conținutul unei secțiuni condiționale cu cuvântul cheie IGNORE, atunci ambele secțiuni pomenite vor fi ignorate.

Dacă cuvântul cheie al secțiunii condiționale este o referință la o entitate parametru, atunci entitatea parametru trebuie înlocuită cu conținutul său înainte ca procesorul să decidă dacă să includă sau să ignore secțiunea condițională.

Un exemplu:
 
<!ENTITY % draft 'INCLUDE'> 
<!ENTITY % final 'IGNORE'> 

<![%draft; [ 
<!ELEMENT> book (comments*, title, body, supplements?)> 
]]> 
<![%final;[ 
<!ELEMENT book (title, body, supplements?)> 
]]>

4. Structuri fizice

Un document XML poate consta dintr-una sau mai multe unității de stocare. Acestea poartă denumirea de entități (entities); toate au un conținut (content) și toate pot fi identificate printr-un nume (name) (excepție face entitatea document - vezi mai jos - și subsetul DTD extern). Fiecare document XML are o entitate numită entitatea document, ce servește ca și punct de pornire pentru un procesor XML și ce poate conține întregul document.

Entitățile pot fi parsate sau neparsate. Conținuturile unei entităților parsate (parsed entity) sunt referite pentru textele înlocuitoare; acest text este considerat o parte integrantă a documentului.

O entitate neparsată (unparsed entity) este o resursă al cărei conținut, poate sau nu poate să fie text, iar dacă este text, poate să nu fie XML. Fiecare entitate neparsată are asoiată o notație, identificată prin nume. În spatele cerinței ca un procesor XML să-i facă disponibile unei aplicații, identificatorii entității și ai notației, XML-ul nu face nici o restricție asupra conținutului entităților neparsate.

Entitățile parsate sunt invocate prin nume, utilizând referințe la entități; entitățile neparsate prin nume, dat ca și valoare a atributelor ENTITY sau ENTITIES.

Entitățile generale (general entities) sunt entitățile ce sunt utilizate în conținutul unui document. În această specificație, entitățile generale sunt uneori referite cu ajutorul termenului necalificat entitate, atunci când acesta nu produce confuzii. Entitățile parametru sunt entități parsate ce sunt utilizate în interiorul DTD-ului. Aceste două tipuri de entități utilizează forme diferite de referințe și sunt recunoscute în contexte diferite. Mai mult, ele ocupă diferite domenii de nume; o entitate parametru și o entitate generală cu același nume, sunt două entități distincte.

4.1 Referințele la caractere și la entități

O referință la un caracter (character reference) se referă la un caracter specific din setul  ISO/IEC 10646, de exemplu, unul ce nu este accesibil direct de la dispozitivele de intrare disponibile.
 
Referință la un caracter (Character Reference)
[66] CharRef   ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' [WFC: Caracter Legal]
 
WFC (Constrângere pentru documentele bine formate): Caracter Legal. Caracterele referite prin utilizarea referințelor la caractere trebuie să respecte producția Char.
Dacă referința caracter începe cu "&#x", literele și cifrele prezente până la terminatorul ; furnizează o reprezentare hexazecimală a codului caracterului în setul ISO/IEC 10646. Dacă începe doar cu "&#", cifrele prezente până la terminatorul ; furnizează o reprezentare zecimală a codului caracterului.

O referință la o entitate (entity reference) indică spre conținutul unei entițăti cu nume. Referințele spre entitățile generale parsate, utilizează caracterele (&) și (;) ca și delimitatori. Referințele la entitățile parametru (parameter-entity references) utilizează semnul procent (%) și punctul și virgula (;) ca și delimitatori.
 
Referința la o entitate (Entity Reference)
[67]  Reference   ::= EntityRef | CharRef  
[68]  EntityRef   ::= '&' Name ';' [WFC: Entitate declarată] 
[VC: Entitate declarată] 
[WFC: Entitate parsată] 
[WFC: Fără recursivitate]
[69] PEReference   ::= '%' Name ';' [VC: Entitate declarată] 
[WFC: Fără recursivitate] 
[WFC: În DTD]
 

WFC (Constrângere pentru documente bine formate): Entitate declarată. Într-un document fără nici un DTD, într-un document ce are doar un subset DTD intern ce nu conține nici o referință la entități parametru sau într-un document cu "standalone='yes'", numele (Name) dat în referința la entitate trebuie să se potriveascu cu cea dată în declarația entității, cu exepția că documentele bine formate nu trebuie să declare nici una dintre entitățiile: amp, lt, gt, apos, quot. Declarația unei entități parametru trebuie să preceadă orice referință spre ea. Similar, declarația unei entități generale trebuie să preceadă orice referință la ea, ce apare în valoarea implicită, într-o declarație a unei liste de atribute.
De menționat că, dacă există entității declarate în subsetul extern sau în entitățiile parametru externe, un procesor non-validator nu este obligat să le citească și să le proceseze declarațiile; pentru astfel de documente, regula că o entitate trebuie declarată este o constrângere pentru documente bine formate numai dacă standalone='yes'.
VC (Constrângere de validitate): Entitate declarată. Într-un document cu un subset extern sau cu entități parametru externe cu "standalone='no'", numele (Name) dat în referința parametru trebuie să se potrivească cu cel dat într-o declarație a unei entități. Pentru interoperabilitate, documentele valide ar trebui să declare entitățiile amp, lt, gt, apos și quot în forma specificată în Secțiunea 4.6.: Entități predefinite. Declarația unei entități parametru trebuie să preceadă orice declarație spre ea. Similar, declarația unei entități generale trebuie să preceadă orice referință spre ea, referință ce poate apare în valoarea implicită într-o declarație a unei liste de atribute.
WFC (Constrângere pentru documentele bine formate): Entitate parsată. O referință la o entitate nu trebuie să conțină numele unei entități neparsate. Entitățile neparsate pot fi referite numai în valorile atributelor declarate a fi de tipul ENTITY sau ENTITIES.
WFC (Constrângere pentru documentele bine formate): Fără recursivitate. O entitate parsată nu trebuie să conțină a referință recursivă la ea însăși, nici direct, nici indirect.
WFC (Constrângere pentru documente bine formate): În DTD. Referințele la entitățile parametru pot apare numai în DTD.
Exemple de referințe la caractere și la entități:
 
Type <key>less-than </key> (&#x3C;) to save options. 
This document was prepared on &docdate; and 
is classified &security-level;
 
Exemplu al unei referințe la o entitate parametru:
 
<!--declarația entității parametru "ISOLat2" ... --> 
<!ENTITY % ISOLat2 
    SYSTEM "http://www.xml.com/iso/isolat2-xml.entities"> 
<!-- ... acum referința spre ea. --> 
%ISOLat2;

4.2 Declarații de entități

Entitățile sunt declarate astfel:
 
Declarație de entitate (Entity Declaration)
[70] EntityDecl   ::= GEDECL | PEDecl
[71]
GEDecl 
 ::= '<!ENTITY' S Name S EntityDef S? '>' 
[72]
PEDecl 
 ::=  '<!ENTITY' S '%' S Name S PEDef S? '>' 
[73]
EntityDef 
 ::= EntityValue | (ExternalID NDataDecl?)
[74]
PEDef 
 ::= EntityValue | ExternalID
 
Numele (Name) identifică entitatea dintr-o referință la o entitate sau, în cazul unei entități neparsate, într-o valoare a unui atribut ENTITY sau ENTITIES. Dacă aceiași entitate este declarată de mai multe ori, doar prima declarație întânită va fi luată în considerare; la cererea utilizatorului, un procesor XML poate genera o avertizare dacă entitățiile sunt declarate de mai multe ori.

4.2.1 Entități interne

Dacă prin definiție, entitatea este o valoare de tip entitate (EntityValue), entitatea definită este numită entitate internă (internal entity). Nu există obiecte de stocare fizice separate, iar conținutul entității este dat în declarație. De menționat că anumite procesări ale unor referințe la caractere și la entități, pot cere ca în valoarea entității literale să fie pus textul corect de înlocuit: vezi Secțiunea 4.5: Construcția textului de înlocuit al unei entități interne.

O entitate internă este o entitate parsată.

Exemplu al unei declarații a unei entități interne:
 
<!ENTITY Pub-status "This is a pre-release of the specification.">

 4.2.2 Entități externe

Dacă entitatea nu este internă, atunci ea este o entitate externă (external entity), declarată după cum urmează:
 
Declarația unei entități externe (External Entity Declaration)
[75] ExternalID   ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral  
[76] NDataDecl   ::= S 'NDATA' S Name [VC: Notație declarată]
 
Dacă NDATADecl este prezent, atunci este o entitate generală neparsată; altfel este o entitate parsată.
VC(Constrângere de validitate): Notație declarată. Numele (Name) trebuie să se potrivească cu numele declarat al unei notații.
Literalul sistem (SystemLiteral) este numit identificatorul sistem al entității (system identifier). El este un URI, ce poate fi utilizat pentru a găsi entitatea. De menționat că diezul (#) și identificatorul de fragment utilizat frecvent cu un URI nu este, formal, parte a URI-ului însuși; un procesor XML trebuie să genereze o eroare dacă identificatorul de fragment este dat ca o parte al unui identificator sistem. Mai puțin atunci când este furnizat de informații aflate în afara scopului acestei specificații (de exp. un tip special de element XML definit de un DTD particular sau o instrucțiune de procesare definită de specificația unei aplicații particulare), URI-urile relative sunt relative la locația resurselor în interiorul căreia apare declarația entității. Un URI poate fi astfel relativ la entitatea document, la entitatea ce conține DTD-ul extern sau la alte entități parametru externe.

Un procesor XML ar trebui să trateze un caracter non-ASCII dintr-un URI prin reprezentarea lui în setul UTF-8 prin unul sau mai mulți octeți și apoi prin schimbarea acestor octeți printr-un mecanism de schimbare URI (de exemplu prin cenvertirea fiecăriu octet la forma %HH, unde HH este o reprezentare hexazecimală a valorii octetului).

În plus la un identificator sistem, un identificator extern poate să-i includă un identificator public (public identifier). Un procesor XML ce încearcă să încarce conținutul unei entități poate utiliza identificatorul public pentru a încerca să genereze un URI alternativ. Dacă procesorul este incapabil să facă acest lucru, atunci el trebuie să utilizeze URI-ul specificat în literalul sistem. Înainte de a se încerca o potrivire, toate șirurile de spații albe din identificatorul public trebuie să fie normalizate la câte un singur caracter spațiu (#x20), iar spațiile albe de la început și de la sfârșit trebuie înlăturate.

Exemple de declarații de entități externe:
 
<!ENTITY open-hatch 
    SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml"> 
<!ENTITY open-hatch 
    PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN" 
    "http://www.textuality.com/boilerplate/OpenHatch.xml"> 
<!ENTITY hatch-pic 
    SYSTEM "../grafix/OpenHatch.gif" 
    NDATA gif> 

4.3 Entități parsate

4.3.1 Declarație de text

Fiecare entitatate parsată externă poate începe cu o declarație de text.
 
Declarație de text (Text Declaration) 
[77] TextDecl   ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
 
Declarația de text trebuie să fie furnizată literal, nu prin referință la o entitate parsată. Nici o declarație de text nu poate apare în orice poziție, ci doar la începutul unei entități externe parsate.

4.3.2 Entități parsate bine formate

Entitatea document este bine formată dacă se potrivește cu producția etichetată document. O entitate generală externă parsată este bine formată dacă se potrivește cu producția etichetată extParsedEnt. O entitate parametru externă este bine formată dacă se potrivește cu producția etichetată extPE.
 
Entitate externă parsată bine formată (Well-Formed External Parsed Entity)
[78] extParsedEnt   ::= TextDecl? content
[79] extPE   ::= TextDecl? extSubsetDecl
O entitate generală internă parsată este bine formată dacă textul ei de înlocuit se potrivește cu producția etichetată content.
Toate entitățile parametrice interne sunt bine formate prin definiție.

O consecință a entităților bine formate este faptul că structurile fizică și logică a unui document XML sunt bine îmbricate; nici un marcaj de început, de sfârșit, nici un marcaj marcaj gol, nici un element, comentariu, instrucțiune de procesare, referință caracter sau referință entitate nu poate începe într-o entitate și să se termine în alta.

4.3.3 Codificarea caracterelor în entități

Fiecare entitate externă parsată dintr-un document XML poate utiliza o codificare diferită pentru caracterele sale.
Toate procesoarele XML trebuie să fie capabile să citească entități ce sunt fie în UTF-8, fie în UTF-16.

Entitățile codificate cu ajutotul UTF-16, trebuie să înceapă cu marcajul ordinii octeților (Byte Order Mark) descris de către ISO/IEC 10646 Anexa E și de către Unicode Anexa B (caracterul ZERO WIDTH NO-BREAK SPACE, #xFEFF). Acesta este doar o semnătură de codificare, deci nu face parte din nici un marcaj sau dată caracter din documentul XML. Procesoarele XML trebuie să fie capabile să utilizeze acest caracter pentru a face diferența dintre documentele codificate cu UTF-8 și cu UTF-16.

Deși unui procesor XML i se cere să citească doar entități codificate cu UTF-8 sau UTF-16, este cunoscut faptul că mai există și alte codificări utilizate în lume, și poate că există dorința de ca procesoare XML care să poată citi și entități care le folosesc. Entitățiile parsate ce sunt stocate utilizându-se alte codificări decât UTF-8 sau UTF-16, trebuie să înceapă cu o declarație de text (text declaration) ce conține o declarație de codificare:
 
Declarația codificării (Encoding Declaration)
[80] EncodingDecl   ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'")  
[81] EncName   ::= [A-Za-z] ([A-Za-z0-9._] | '-')*  /*Numele codificării conține numai caractere latine*/
 
În entitatea document, declarația codificării este o parte a declarației XML. EncName dă numele codificării utilizate.

Într-o declarație de codificare, valorile "UTF-8", "UTF-16", "ISO-10646-UCS-2" și "ISO-10646-UCS-4" trebuie să fie utilizate pentru diferite codificări și transformări ale Unicode / ISO / IEC 10646, valoriile "ISO-8859-1", "ISO-8859-2", ... și "ISO-8859-9" trebuie să fie utilizate pentru părți ale ISO 8859, iar valoriile "ISO-2022-JP", "Shift_JIS", și "EUC-JP" trebuie să fie utilizate pentru diferite forme de codificare ale JIS-0208-1997. Procesoarele XML pot recunoaște și alte codificări; este recomandabil ca codificăriile înregistrate (ca și seturi de caractere) la Internet Assigned Numbers Authotity [IANA], altele decât cele pomenite deja, să fie referite utilizându-se numele lor înregistrate. De menționat că aceste nume înregistrate sunt definite ca fiind insenzitive la mărimea literelor, deci procesoarele care doresc să le recunoască trebuie să o facă într-un mod insenzitiv la mămimea literelor.

În absența unor informații furnizate de un protocol de transport extern (de exemplu HTTP sau MIME), avem de a face cu o eroare, atunci când o entitate ce are o declarație de codificare și îi este prezentată procesorului utilizându-se o altă codificare decât cea declarată, atunci când declarația de codificare apare în altă parte decât la începutul unei entității externe sau atunci când o entitate nu începe nici cu marcajul ordinii octeților (Byte Order Mark) și nici cu o declarație de codificare și utilizează o altă codificare decât UTF-8. De menționat faptul că, odată ce ASCII este un subset al lui UTF-8, pentru entitățiile ce utilizează doar setul ASCII nu este necesar să posede o declarație a codificării.

Avem de a face cu o eroare fatală, atunci când un procesor XML întâlnește o entitate cu o codificare pe care nu o poate procesa.

Exemple de declarații de codificare:
 
<?xml encoding='UTF-8'?> 
<?xml encoding='EUC-JP'?>

4.4 Tratamentul aplicat de către procesorul XML entitățiilor și referințelor

Tabelul de mai jos sumarizează contextele în care pot apare referințe la  caractere, referințe la entități și invocări ale entităților neparsate și modul în care trebuie să se comporte procesoarele XML în fiecare dintre cazuri. Etichetele din coloana stânga numesc contextul:
Referință în conținut
determină o referință aflată oriunde între marcajul de început și marcajul de sfârșit al unui element; corespunde non-terminalului content.
Referință în valoarea atributelor
determină o referință aflată în valoarea unui atribut într-un marcaj de început sau dat ca și valoare implicită în declarația unui atribut; corespunde non-terminalului AttValue.
Apare ca și valoare a unui atribut
determină un nume (Name), nu o referință, ce apare ca și valoare a unui atribut ce a fost declarată de tip ENTITY sau ce apare ca și una dintre unitațile (tokens) separate prin spațiu, în valoarea unui atribut ce a fost declarat de tip ENTITIES.
Referință în valoarea entității
determină o referință dintr-un parametru sau o valoare literale a unei entități interne în declararea unei entități; corespunde non-terminalului EntityValue.
Referință în DTD
determină o referință aflată într-un subset DTD intern sau extern, dar în afara unei valori a unei entității (EntityValue) sau a unei valori a unui atribut (AttValue).
 
  Tipul entității Caracter
Parametru Intern General Extern 
Parsat 
General
Neparsat
Referință în 
conținut
Nerecunoscut Inclus Inclus dacă se validează Interzis Inclus
Referință în 
valoarea atributelor
Nerecunoscut Inclus în literal Interzis Interzis Inclus
Apare ca și valoare 
a unui atribut
Nerecunoscut Interzis Interzis Atenționare Nerecunoscut
Referință în 
valoarea entității
Inclus în literal Evitat Evitat Interzis Inclus
Referință 
în DTD
Inclus ca și PE Interzis Interzis Interzis Interzis

4.4.1 Nerecunoscut

În afara DTD-ului, caracterul % nu are o semnificație specială; astfel, ceea ce va fi recunoscut ca și referință spre o entitate parametru în DTD, nu este recunoscut ca și marcaj special în conținut (content). Similar, numele entităților neparsate nu sunt recunoscute, excepție fiind atunci când ele apar în valoarea unui atribut declarat corespunzător.

4.4.2 Inclus

O entitate este inclusă atunci când textul de înlocuit este regăsit și procesat în locul referinței, ca și cum ar fi fost o parte a documentului în poziția în care a fost recunoscută referința. Textul de înlocuit poate conține atât date caracter, cât și (cu excepția entităților parametru) marcaje, care trebuie recunoscute în modul obișnuit, cu excepția că textul de înlocuit al entităților utilizate pentru a include delimitatorii de marcaje (entitățiile amp, lt, gt, apos, quot) este tratat întodeauna ca și date. (Șirul "AT&amp;T;" este extins la "AT&T;" și caracterul (&) rămas nu este recunoscut ca și delimitator de entitate referință.) O referință la un caracter este inclusă atunci când caracterul indicat este procesat în locul referinței însăși.

4.4.3 Inclus dacă se validează

Când un procesor XML recunoaște o referință la o entitate parsată, în loc de a valida documentul, procesorul va trebui să includă texul de înlocuit. Dacă entitatea este externă, iar procesorul nu încearcă să valideze documentul, procesorul poate, dar nu este necasar să includă textul de înlocuit al entității. Dacă un procesor non-validator nu include textul de înlocuit, el trebuie să informeze aplicația că a recunoscut entitatea, dar nu a citit-o.

Regula se bazează pe recunoașterea că includerea automată furnizată de mecanismul entităților din SGML și XML, proiectat la început pentru a suporta modularitate în crearea documentelor, nu este în mod necesar în concordanță cu alte aplicații și în particular, cu navigatoarele. Navigatoarele, de exemplu, când întâlnesc o referință la entitate externă parsată, pot alege indicarea vizuală a prezenței unei entități și poate să o încarce și să o afișeze numai la cerere.

4.4.4 Interzis

Următoarele lucruri sunt interzise și constituie erori fatale:

4.4.5 Inclus în literal

Când o referință la o entitate apare în valoarea unui atribut sau o referință la o entitate parametru apare în valoarea literală a entității , textul ei de înlocuit este procesat în locul referinței ca și cum el ar fi făcut parte din document la locația în care a fost recunoscută referința, cu excepția că caracterul ghilimele simple sau duble din textul de înlocuit va fi tratat ca și dată cacater și nu va termina literalul. De exemplu, așa este bine format:
 
<!ENTITY % YN '"Yes"'> 
<!ENTITY WhatHeSaid "He said &YN;">
 
pe când așa nu este bine format:
 
<!ENTITY EndAttr "27'"> 
<!element attribute='a-&EndAttr;>

4.4.6 Atenționare

Când un nume al unei entități neparsate apare ca și unitate în valoarea unui atribut declarat de tip ENTITY sau ENTITIES, un procesor validator trebuie să informeze aplicația de existența identificatorilor system și public (dacă există) atât pentru entitate, cât și pentru notația asociată.

4.4.7 Evitat

Când o referință la o entitate generală apare în valoarea entității (EntityValue) din declararea unei entități, se trece peste ea și este lăsată așa cum este.

4.4.8 Inclusă ca și PE

La fel ca și entitățile parsate externe, entitățile parametru trebuie să fie incluse dacă se validează. Când o referință la o entitate parametru este recunoscută în DTD și este inclusă, textul ei de înlocuit este mărit cu câte un caracter spațiu la început și la sfârșit (#x20); intenția este de a constrânge textul de înlocuit al entitățiilor parametru să conțină un număr integral de cuvinte gramaticale în DTD.

4.5 Construcția textului de înlocuit al unei entități interne

În discuția despre tratamentul entităților interne, este bine să distingem între două forme de valori ale entităților. Valoarea literală a entității (literal entity value) este un string pus între ghilimele prezent chiar în declarația entirății, ce corespunde non-terminalului EntityValue. Textul de înlocuit (replacement text) este conținutul entității, după înlocuirea referințelor la caractere și referințele la entitățile parametru.

Valoarea literală a entității, așa cum este ea dată în declarația entității (EntityValue) poate conține referințe la caractere, la entități parametru și la entități generale. Astfel de referințe, trebuie să fie conținute în întregime în valoarea literală a entității. Textul efectiv de înlocuit ce este inclus după descrierea anterioară trebuie să conțină textul de înlocuit al oricărei entități parametru referite și trebuie să conțină toate caracterele referite, în locul oricărei referințe la caracter în valoarea literală a entității; oricum, referințele la entități generale trebuie lăsate așa cum sunt, neexpandate. De exemplu, dată fiind următoarea declarație:
 
<!ENTITY % pub "&#xc9;digitions Gallimard"> 
<!ENTITY rights "All rights reserved"> 
<!ENTITY book "La Peste: Albert Camus, 
    &#xA9; 1947 %pub;. &rights;">
 
textul de înlocuit al entității "book" este:
 
La Peste: Albert Camus, 
© 1947 Éditions Gallimard. &rights;
 
Referința la entitatea generală "%rights;" va fi expandată atunci când referința "&book;" va trebui să apară în conținutul documentului sau în valoarea unui atribut.

Aceste reguli simple pot avea repercursiuni complexe; pentru o discuție mai detailată a unui exemplu mai dificil, vezi Anexa D: Expandarea referințelor la entități și la caractere.

4.6 Entitățile predefinite

Referințele la caractere și la entități pot fi utilizate pentru a înlocui paranteza unghiulară stângă, and-ul și alți delimitatori. În acest scop este specificat un set de entități generale (amp, lt, gt, apos, quot). Pot fi utilizate și referințe numerice la caractere; ele vor fi expandate imediat ce sunt recunoscute și trebuie să fie tratate ca și date caracter, deci referințele numerice la caracterele "&#60;" și "&#38;" pot fi utilizate pentru a înlocui < și & când acestea apar în datele caracter.

Toate procesoarele XML trebuie să recunoască aceste entități chiar dacă sunt declarate sau nu. Pentru interoperabilitate, documenetele XML valide trebuie să declare aceste entități, împreună cu celelalte entități, înainte de a le utiliza. Dacă entitățile în discuție sunt declarate, ele trebuie să fie declarate ca și entități interne a căror text de înlocuit să fie un doar caracterul ce a fost înlocuit sau să fie declarate ca și referințe la aceste caractere, cum este arătat mai jos:
 
<!ENTITY lt "&#38;#60;"> 
<!ENTITY gt "&#62;"> 
<!ENTITY amp "&#38;#38;"> 
<!ENTITY apos "&#39;"> 
<!ENTITY quot "&#34;">
 
De menționat că caracterele < și & din declarațiile "lt" și "amp" sunt înlocuite de două ori pentru a îndeplini condiția ca înlocuirea entității să fie bine formată.

4.7 Declarațiile notaților

Notațile (notation) identifică printr-un nume formatul entităților neparsate, formatul elementelor ce auun atribut de tip notație sau aplicația căreia îi este destinată instrucțiunea de procesare.

Declarațiile de notații (notation declarations) furnizează un nume pentru notație, pentru utilizarea acestuia în declarațiile unor entități sau liste de atribute și în specificațiile atributelor și un identificator extern pentru notație, ce va permite procesoarelor XML sau aplicațiilor client să localizeze o aplicație ce va veni în ajutor, capabilă să proceseze datele dintr-o notație dată.
 
Declarații de notații (Notation Declarations)
[82] NotationDecl   ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'
[83] PublicID   ::= 'PUBLIC' S PubidLiteral
 
Procesoarele XML trebuie să le furnizeze aplicațiilor numele și identificatorul extern al oricărei notații declarate și referită în valoarea unui atribut, în definiția unui atribut sau în declarația unei entități. Ele pot în plus să descompună identificatorul extern într-un identificator system, într-un nume de fișier sau în alte informații ce vor permite aplicației să apeleze un procesor pentru datele din notația descrisă. (Oricum, este o eroare ca documentele XML să declare și să facă referințe la notații pentru care nu există aplicații specifice disponibile pe sistemul pe care rulează procesorul XML și aplicația XML.)

4.8 Entitatea document

Entitatea document (document entity) stă pe post de rădăcină în arborele entităților și este un punct de pornire pentru procesorul XML. Această specificație nu descrie modul în care este localizată entitatea document de către procesor; spre deosebire de celelalte entități, entitatea document nu are nume și poate, foarte bine, să apară la o intrare a procesorului fără nici o identificare.

5. Conformanța

5.1 Procesoarele validatoare și non-validatoare

Procesoarele XML, ce se conformează acestei specificații, intră în două clase: validatoare și non-validatoare.

Procesoarele validatoare și non-validatoare seamănă prin faptul că trebuie să raporteze violările constrângerilor pentru documentele bine formate prezente în această specificație, din entitatea document și din orice altă entitate pe care ele o citesc.

Procesoarele validatoare (validating processors) trebuie să raporteze violările constrângerilor date în DTD și orice eșec al completitudinii constrângerilor de validare date în această specificație. Pentru a face acest lucru, procesoarele DTD trebuie să citească și să proceseze tot DTD-ul și toate entitățile externe spre care se fac referiri în document.

Procesoarelor non-validatoare li se cere să verifice numai entitatea document, incluzând întregul subset DTD intern, pentru constrângerile pentru documentele bine formate. Odată ce lor nu li se cere să verifice validitatea documentului, lor li se cere să proceseze toate declarațile pe care le citesc din subsetul DTD-ului intern și din orice entitate parametru pe care o citesc, până la prima referință la o entitate parametru pe care nu o mai citesc; cu alte cuvinte, ele trebuie să utilizeze din acele declarații pentru a normaliza valorile atributelor, pentru a include textele de înlocuit ale entităților interne și pentru a furniza valorile implicite ale atributelor.
Ele nu trebuie să proceseze declarațiile de entități sau declarațiile listelor de atribute întâlnite după o referință la o entitate parametru ce nu este citită, odată ce acea entitate poate conține declarații ce ar trebui suprascrise.

5.2 Utilizarea procesoarelor XML

Comportamentul unui procesor XML validator este în mare măsură previzibil; el trebuie să citească fiecare parte dintr-un document și trebuie să raporteze toate violăriile constrângerilor de validitate și ale documentelor bine-formate. Mult mai puțin i se cere unui procesor non-validator; el nu trebuie să citească nici o parte a documentului, exceptând entitatea document. Acest lucru poate avea două efecte ce pot fi importante pentru utilizatorii procesoarelor XML: Pentru o siguranță maximă a interoperabilității dintre diferite procesoare XML, aplicațiile ce utilizează procesoare non-validatoare nu trebuie să aibă încredere în nici un comportament ce nu este cerut de la aceste procesoare. Aplicațiile ce au nevoie de facilități precum utilizarea atributelor implicite sau a entităților interne ce sunt declarate în entități externe, ar trebui să utilizeze procesoare XML validatoare.

6. Sistemul de notare

În acest document, gramatica formală a XML-ului este dată utilzând sistemul simplu de notații Extended Backus-Naur Form (EBNF). Fiecare regulă din gramatică definește un simbol, în următoarea formă
 
simbol::=expresie
 
Simbolurile încep cu literă mare dacă sunt definite de către o expresie regulară sau cu literă mică în celelalte cazuri. Șirurile literale sunt puse între ghilimele.

Într-o expresie din partea dreaptă a unei reguli, următoarele expresii sunt utilizate pentru a se potrivi cu șiruri cu unul sau mai multe caractere:

#xN
unde N este un întreg hexazecimal. Expresia se potrivește cu un caracter în ISO/IEC 10646, al cărei valoare codificată canonic (UCS-4), atunci când este interpretat ca și număr binar fără semn, are valoarea indicată. Numărul de numere de zero de la începutul expresiei #xN este nesemnificativ; numărul de cifre zero de la început din valorii codificate corespondente este guvernat de codificarea carcterelor utilizată curent și nu este semnificativ pentru XML.
[a-zA-Z], [#xN-#xN]
se potrivește cu orice caracter a cărui valoare intră în gama (gamele) indicată (inclusiv).
[^a-z], [^#xN-#xN]
se potrivește cu orice caracter a cărui valoare este în afara gamei indicate.
[^abc], [^#xN#xN#xN]
se potrivește cu orice caracter ce are o valoare diferită de cele ale caracterelor date.
"string"
se potrivește cu un șir literal ce se potrivește cu cel dat între ghilimelele duble.
'string'
se potrivește cu un șir literal ce se potrivește cu cel dat între ghilimelele simple.
Aceste simboluri pot fi combinate pentru a se potrivi cu modele mult mai complexe, după cum urmeză, unde A și B reprezintă expresii simple:
(expresie)
expresia este tratată ca și unitate și poate fi combinată după descrierile din această listă.
A?
se potrivește cu A sau cu nimic; A opțional.
A B
se potrivește cu A urmată de B.
A | B
se potrivește cu A sau cu B, dar nu cu ambele.
A - B
se potrivește cu orice șir ce se potrivește cu A, dar nu se potrivește cu B.
A+
se potrivește cu una sau mai multe apariții a lui A.
A*
se potrivește cu mai multe apariții a lui A sau cu nici o apariție.
Alte notații utilizate în producții sunt:
/* ... */
comentariu.
[ wfc: ... ]
o constrângere pentru documente bine formate; aceasta identifică prin nume o constrângere asupra documentelor bine formate asociate cu o producție.
[ vc: ... ]
constrângere de validitate; aceasta indentifică prin nume o constrângere asupra documentelor valide asociate cu o producție.

Anexe

 
 

A. Referințe

 

A.1 Referințe normative

IANA
(Internet Assigned Numbers Authority) Official Names for Character Sets, ed. Keld Simonsen și alții. Vezi ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets.
IETF RFC 1766
IETF (Internet Engineering Task Force). RFC 1766: Tags for the Identification of Languages, ed. H. Alvestrand. 1995.
ISO 639
(International Organization for Standardization). ISO 639:1988 (E). Code for the representation of names of languages. [Geneva]: International Organization for Standardization, 1988.
ISO 3166
(International Organization for Standardization). ISO 3166-1:1997 (E). Codes for the representation of names of countries and their subdivisions -- Partea 1: Country codes [Geneva]: International Organization for Standardization, 1997.
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1993 (E). Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Partea 1: Architecture and Basic Multilingual Plane. [Geneva]: International Organization for Standardization, 1993 (plus amendamentele de la AM 1 la AM 7).
Unicode
The Unicode Consortium. The Unicode Standard, Versiunea 2.0. Reading, Mass.: Addison-Wesley Developers Press, 1996.

A.2 Alte referințe

Aho/Ullman
Aho, Alfred V., Ravi Sethi, și Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools. Reading: Addison-Wesley, 1986, rpt. corr. 1988.
Berners-Lee și alții
Berners-Lee, T., R. Fielding, și L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax and Semantics. 1997. (În lucru; vezi noutățile de la RFC1738.)
Brüggemann-Klein
Brüggemann-Klein, Anne. Regular Expressions into Finite Automata. Extended abstract in I. Simon, Hrsg., LATIN 1992, S. 97-98. Springer-Verlag, Berlin 1992. Întreaga versiune în teoria informaticii 120: 197-213, 1993.
Brüggemann-Klein and Wood
Brüggemann-Klein, Anne, and Derick Wood. Deterministic Regular Languages. Universität Freiburg, Institut für Informatik, Bericht 38, Oktober 1991.
Clark
James Clark. Comparison of SGML and XML. See http://www.w3.org/TR/NOTE-sgml-xml-971215.
IETF RFC1738
IETF (Internet Engineering Task Force). RFC 1738: Uniform Resource Locators (URL), ed. T. Berners-Lee, L. Masinter, M. McCahill. 1994.
IETF RFC1808
IETF (Internet Engineering Task Force). RFC 1808: Relative Uniform Resource Locators, ed. R. Fielding. 1995.
IETF RFC2141
IETF (Internet Engineering Task Force). RFC 2141: URN Syntax, ed. R. Moats. 1997.
ISO 8879
ISO (International Organization for Standardization). ISO 8879:1986(E). Information processing -- Text and Office Systems -- Standard Generalized Markup Language (SGML). Prima ediție -- 1986-10-15. [Geneva]: International Organization for Standardization, 1986.
ISO/IEC 10744
ISO (International Organization for Standardization). ISO/IEC 10744-1992 (E). Information technology -- Hypermedia/Time-based Structuring Language (HyTime). [Geneva]: International Organization for Standardization, 1992. Extended Facilities Annexe. [Geneva]: International Organization for Standardization, 1996.

B Clasele de caractere

În cele ce urmează sunt date caracteristicile definite în standarul Unicode, în care caracterele sunt clasificate în caractere de bază (printre altele, aici se regăsesc caracterele alfabetice al alfabetului Latin, fără diacritice), caracterele ideografice și caracterele combinate (printre altele, aici se regăsesc cele mai multe diacritice); aceste clase sunt combinate pentru a forma clasa literelor. Cifrele și extensile sunt și ele date într-un mod separat.
 
Caractere (Characters)
[84] Letter   ::= BaseChar | Ideografic
[85]
BaseChar 
 ::= [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | [#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | [#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | #x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | [#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]
[86]
Ideografic 
 ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]
[87]
CombiningChar 
 ::= [#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | [#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | [#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | [#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | #x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | [#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | [#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | #x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | [#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | [#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | #x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | [#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | [#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | [#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | [#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | [#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | #x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | [#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | #x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | [#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | [#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | #x3099 | #x309A
[88]
Digit 
 ::= [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | [#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | [#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]
[89] Extender   ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]
 
Clasele de caractere definite aici pot fi derivate din baza de date Unicode după cum urmeză:

C. XML și SGML (Ne-normativ)

XML este proiectat pentru a fi un subset al SGML-ului, prin faptul că orice document XML valid trebuie să fie un document SGML ce se supune regulilor. Pentru o comparație detailată a restricților adiționale pe care le face XML-ul în spatele celor din SGML, vezi [Clark].

D. Expansiunea referințelor la entități și la carctere (Ne-normativ)

Această anexă aconține câteva exemple ce ilustrează secvența recunoașterii și expansiunii referințelor la entități și caractere, conform specificațiilor din Secțiunea 4.4: Tratamentul aplicat de către procesorul XML entitățiilor și referințelor.

Dacă DTD-ul conține declarația
 
<!ENTITY example "<p>An ampersand (&#38; #38;) may be escaped 
numerically (&#38;#38;#38;) or with a general entity 
(&amp;amp;). </p>">
 
atunci procesorul XML va recunoaște refințele la carctere când va parsa declarația entității și le va rezolva înaintea stocării următorului șir ca și valoare a entității "example":
 
<p> An ampersand (&#38;) may be escaped 
numerically (&#38;#38;) or with a general entity 
(&amp;amp;). </p>
 
O referință din document la "&example;", va cauza ca textul să fie reparsat, moment în care marcajul de început și marcajul de sfârșit al elementului "p" vor fi recunoscute, iar cele trei referințe vor fi recunoscute și expandate, rezultând un element "p" cu următorul conținut (totul este dată, fără delimitatori sau marcaje):
 
An ampersand (&) may be escaped 
numerically (&#38;) or with a general entity 
(&amp;).
 
Un exemplu și mai complex va ilustra regulele cu toate efectele lor. În exemplul următor, numerele liniilor sunt date doar pentru referințe.
 
1 <?xml version='1.0'?> 
2 <!DOCTYPE test [ 
3 <!ELEMENT test (#PCDATA) > 
4 <!ENTITY % xx '&#37;zz' > 
5 <!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' > 
6 %xx; 
7 ]> 
8 <test>This sample shows a &tricky; method.</test>
 
Acesta va produce:

E. Modele de conținut deterministice (Ne-normativ)

Pentru compatibilitate, este necesar ca modelele de conținut din declarațiile tipurilor de elemente să fie deterministice.

SGML-ul necesită modele de conținut deterministice (pe care el le numește "nambigue"); procesoarele XML construite pe sistemele SGML pot semnala modelele de conținut nedeterministice prin erori.

De exemplu, modelul de conținut ((b, c) | (b,d)) este nedeterministic, deoarece având un b inițial, parserul nu va putea ști cărui model va aparține un b fără să se uite înainte pentru a vedea ce element urmează după b. În acest caz, cele două referințe la b pot fi combinate într-o singură referință, refâcând modelul sub forma (b, (c | d)). Un b inițial se va potrivi acum, în mod clar cu un singur nume din modelul de conținut. Parserul nu va trebui să se mai uite înainte pentru a vedea ce urmează; va fi acceptat c sau d.

Mai formal: din modelul de conținut poate fi construit un automat finit, utilizând algoritmii standard; de exemplu, algoritmul 3.5 din secțiunea 3.9 din lucrarea lui Aho, Sethi și Ullman [Aho]. În mulți algoritmi de acest gen, sunt construite seturi în fiecare poziție a unei expresii regulate (de exemplu, fiecare nod frunză arborele sintaxtic asociat expresiei regulare); dacă una dintre poziții are un set în care un nume de tip de element apare în mai multe poziți imediat următoare, atunci modelul de conținut este eronat și poate fi raportat ca și eroare.

Există algoritmi ce pot reduce aproape toate modelele de conținut nedeterministice, la modele de conținut deterministice echivalente; vezi Brüggenmann-Klein [ABK].

F. Autodetecția codificării caracterelor (Ne-normativ)

Declarția de codificare XML funcționează precum o etichetă internă pentru fiecare entitate, indicând ce codificare a caracterelor este utilizată. Oricum, înainte ca un procesor XML să poată citi o etichetă internă, el trebuie să știe în aparență ce tip de codificare a caracterelor este utilizat -- cel pe care eticheta internă încearcă să-l indice. În majoritatea cazurilor, aceasta este o situație fără ieșire. Oricum, nu este chiar fără speranță în cazul XML-ului, deoarece XML-ul limitează majoritatea cazurilor la două situații: se consideră că fiecare implementare suportă doar un set finit de codificări de caractere, iar declarația de codificare a XML-ului are o restricție a poziției ei și a conținutului ei cu scopul de a ușura detectarea codificarea caracterelor pe care o utilizează entitățile în fiecare dintre cazurile normale. De asemenea, în multe cazuri, sunt disponibile și alte surse de informații, în completarea fluxului de date XML. Pot fi distinse două cazuri, atunci când entitatea XML îi este prezentată procesorului fără informații (externe) ce o acompaniază și atunci când aceste informații există. Vom considera primul caz mai întâi.

Deoarece fiecare entitate XML ce nu este codificată cu formatul UTF-8 sau cu UTF-16, trebuie să înceapă cu o declarație de codificare XML, caz în care primele caractere trebuie să fie '<?xml', orice procesor normal poate detecta, după primii doi sau patru octeți, care din cazurile următoare sunt aplicate. În citirea acestei liste, este bine de știut că în UCS-4, caracterul '<' este "#x0000003C", iar '?' este "#x0000003F" și marcajul ordinii octeților (Byte Order Mark) cerut de fluxul de date UTF-16 este "#xFEFF".

Acest nivel de autodetecție este suficient pentru a citi declarația de codificare XML și pentru a parsa identificatorul de codificare al caracterelor, care este totuși necesar pentru a distinge membrii individuali ai fiecărei familii de codificări (de exemplu, pentru a distinge UTF-8 de 8859 și diferite părți ale 8858 între ele sau pentru a distinge pagina de cod utilizată, specifică EBCDIC ș.a.m.d.).

Deoarece conținutul declarației de codificare conține doar caractere ASCII, procesorul poate să citească întreaga declarație de codifiare imediat ce a detectat ce familie de codificări este utilzată. Odată ce, în practică, toate codificările de caractere larg utilizate, intră în una dintre categoriile descrise, declarația de codificare XML permite o etichetare a codificării caracterelor sigură, chiar și atunci când sursele externe de informații ale sistemului de operare sau ale protocolului de transport, nu sunt disponibile.

Oadă ce procesorul a detectat codificarea caracterelor utilizată, el poate să se comporte corespunzător, fie prin apelul unei rutine separate pentru fiecare caz, fie prin apelul funcției de conversie propice pentru fiecare caracter de la intrare.

Ca și orice alt sistem care se etichetează singur, declarația de codificare XML nu va merge dacă vre-un soft schimbă setul de caractere al entității sau codificarea fără a reactualiza declarația de codificare. Implementatorii rutinelor de codificare a caracterelor trebuie să asigure acuratețea informațiilor interne și externe utilizate pentru a eticheta entitatea.

Al doilea caz posibil, apare atunci când entitatea XML este însoțită de o informație de codificare, ce este dată în câteva sisteme de fișiere și în câteva protocoale de rețea. Când sunt disponibile mai multe surse de informație, prioritatea lor relativă și metoda preferată de tratare a conflictelor, trebuie să fie specificată în protocolul de la nivelul cel mai înalt, utilizat pentru trimiterea XML-ului. Regulile pentru prioritatea relativă a etichetelor interne și și nivelul tipului MIME dintr-un antet extern, de exemplu, ar trebui să fie părți componente ale documentului RFC ce definesc tipurile MIME text/xml și aplication/xml. Oricum, în interesul interoperabilității, sunt recomandate următoarele reguli.

Aceste reguli se aplică numai în absența documentației protocolului; în particular, când sunt definite tipurile MIME text/xml și aplication/xml, recomandările RFC-ului relevant vor înlocui toate aceste reguli.

G. W3C XML Working Group (Ne-normativ)

Această specificație a fost preparată și aprobată pentru publicare de către W3C XML Working Group (WG). Aprobarea acestei specificații de către WG nu implică în mod necesar că toți membri WG au votat pentru aprobarea ei. Cei mai importanți membrii curenți ai XML WG sunt:

Jon Bosak, Sun (Director);
James Clark (Director tehnic);
Tim Bray, Textuality și Netscape (Coeditor al XML);
Jean Paoli, Microsoft (Coeditor al XML);
C. M. Sperberg-McQueen, University of Ill. (XML Co-editor);
Dan Connolly, W3C (W3C Liaison);
Paula Angerstein, Texcel;
Steve DeRose, INSO;
Dave Hollander, HP;
Eliot Kimber, ISOGEN;
Eve Maler, ArborText;
Tom Magliery, NCSA;
Murray Maloney, Muzmo și Grif;
Makoto Murata, Fuji Xerox Information Systems;
Joel Nava, Adobe;
Conleth O'Connell, Vignette;
Peter Sharpe, SoftQuad;
John Tigue, DataChannel


[Unelte XML]
[Pagina personală a lui Crystian]