[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.
REC-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:
-
XML trebuie să fie simplu de utilizat pe Internet.
-
XML trebuie să suporte o mare verietate de aplicații.
-
XML trebuie să fie compatibil cu SGML.
-
Trebuie să fie ușor să fie scrise programe ce vor
procesa documente XML.
-
Numărul facilitățiilor opționale din XML sunt reduse
la minimum, ideal, la zero.
-
Documentele XML trebuie să fie citibile de către
utilizatori și clare într-un mod rezonabile.
-
Designul XML ar trebui să fie pregătită rapid.
-
Designul XML trebuie să fie formal și concis.
-
Documentele XML trebuie să fie ușor de creat.
-
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ă:
-
Luat ca și întreg, se potrivește cu producția numită
document.
-
Îndeplinește toate constrângerile pentru documentele
bine formate date în această specificație.
-
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ă:
-
Conține unul sau mai multe documente.
-
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] |
S |
::= (#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 "&" și respectiv "<". Paranteza
unghiulară închisă (>) poate fi reprezentată utilizând șirul ">"
și trebuie, pentru compatibilitate, să fie inclusă utilizând ">"
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 "'", iar caracterul ghilimele
(") ca și """.
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 "<" și "&". 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:
-
atributelor cu valori implicite, dacă elementele
asupa cărora se aplică apar în document fără specificarea valorilor acestor
atribute sau
-
entităților (altele decât amp, lt, gt, apos, quot),
dacă referințele la acele entități apar în document sau
-
atributelor a căror valoare intră în procesul de
normalizare, unde atributele apar în document cu o valoare care
se va schimba ca și rezultat al normalizării sau
-
tipurilor de elemente ce au și conținut, dacă spațiile
albe apar direct în orice instanță ale acelor tipuri.
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:
-
un cod de limbaj de două litere precum este definit
în [ISO639], "Codes for the representation of names of languages"
-
un identificator de limbaj înregistrat cu Internet
Assigned Numbers Autority (IANA); acestea încep cu prefixul "i-"(sau cu
"I-")
-
un identificator de limbaj asociat de către utilizator
sau agreat între părți pentru un uz privat; acestea trebuie să înceapă
cu prefixul "x-" sau "X-" pentru a fi siguri că nu intră în conflict cu
nume standardizate sau înregistrate mai târziu cu IANA.
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:
-
Declarația se potrivește cu EMPTY și elementul
nu are conținut.
-
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.
-
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.
-
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 "<"), 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:
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:
-
Pentru a defini un set de atribute ce aparțin unui
tip de element.
-
Pentru a stabili constrângeri legate de tipul acestor
atribute.
-
Pentru a da valori implicite pentru atribute.
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ă:
-
o referință la un caracter este procesată prin adăugarea caracterului referit
la valoarea atributului
-
o referință la o entitate este procesată recursiv prin înlocuirea a textului
de înlocuit
-
un caracter spațiu (#x20, #xD, #xA, #x9) este procesat prin adăugarea valorii
#x20 la valoarea normalizată, cu excepția că doar un singur caracter #x20
este adăugat pentru o secvență "#xD#xA" ce este parte a unei entități externe
parsate sau a unei valori a unei entități literale dintr-o entitate internă
parsată
-
alte caractere sunt normalizate prin adăugarea lor la valoarea normalizată
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> (<)
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&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:
-
apariția unei referințe la o entitate neparsată.
-
apariția oricărui caracter sau a unei referițe la o entitate generală în
DTD, excepție fiind în valoarea atribut (EntityValue) sau în valoarea
entitate (AttValue).
-
o referință la o entitate externă în valoarea unui atribut.
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 "Édigitions Gallimard">
<!ENTITY rights "All rights reserved">
<!ENTITY book "La Peste: Albert Camus,
© 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 "<" și "&" 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 "&#60;">
<!ENTITY gt ">">
<!ENTITY amp "&#38;">
<!ENTITY apos "'">
<!ENTITY quot """> |
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:
-
Anumite erori determinate de constrângerile pentru documentele bine formate,
în special acelea ce necesită citirea entităților externe, pot să nu fie
detectate de către un procesor non-validator. Exemplele includ constrângerile
de sub titlurile Entitate declarată, Entitate parsată și
Fără recursivitate, ca și câteva dintre cazurile descrise ca și
interzis din Secțiunea 4.4: Tratamentul aplicat de către procesorul
XML entitățiilor și referințelor.
-
Informațiile transmise de către procesor către aplicație pot varia, în
funție de faptul că procesorul citește sau nu entitățile parametru și pe
cele externe. De exemplu, un procesor non-validator nu poate normaliza
valorile atributelor, include și textul de înlocuit al entităților
interne sau să furnizeze valorile implicite ale atributelor, iar
unde face acest lucru depinde dacă a citit entitățile parametru și cele
externe.
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ă
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ă:
-
Caracterele de început ale numelor trebuie să fie din una dintre categoriile
Ll, Lu, Lt, Nl.
-
Caracterele din nume, altele decât caracterele de început ale numeler trebuie
să fie din una dintre categoriile Mc, Me, Mn, Lm sau Nd.
-
Caracterele din zona de compatibilitate (de exemplu, cu un cod de caracter
mai mare decât #xF900 și mai mic decât #xFFFE) nu sunt permise în numele
XML.
-
Caracterele ce au un font sau o descompunere de compatibilitate (de exemplu,
acelea cu un marcaj de formatare compatibilă - compatibility formatting
tag - în câmpul 5 al bazei de date -- marcat de către câmpul 5 ce începe
cu un "<") nu sunt permise.
-
Următoarele caractere sunt tratate caractere de început ale numelor, mai
curând decât caractere din nume, pentru că fișierul de prorpietăți le clasifică
ca și alfabetice (Alphabetic): [#x02BB-#x02C1], #x0559, #x06E5, #06E6.
-
Caracterele #x20DD-#x20E0 sunt excuse (în conformitate cu Unicode, secțiunea
5.14).
-
Caracterul #x00B7 este clasificat ca și extensie, pentru că lista de proprietăți
așa îl identifică.
-
Caracterul #x0387 este adăugat la caracterele numelor, deoarece #x00B7
este echivalentul său canonic.
-
Caracterele ':' și '_' sunt permise ca și caractere pentru începutul numelor.
-
Caracterele '-' și '.' sunt permise ca și caractere din nume.
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;) may be escaped
numerically (&#38;#38;) or with a general entity
(&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 (&) may be escaped
numerically (&#38;) or with a general entity
(&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 (&) or with a general entity
(&). |
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 '%zz' >
5 <!ENTITY % zz '<!ENTITY tricky "error-prone" >' >
6 %xx;
7 ]>
8 <test>This sample shows a &tricky; method.</test> |
Acesta va produce:
-
în linia 4, referința la caracterul 37 este expandată imediat, și entitatea
parametru "xx" este stocată în tabela sibolurilor cu valoarea "%zz;". Odată
ce textul de înlocuit nu este rescanat, referința la entitatea parametru
"zz" nu este recunoscută. (Și ar fi generat o eroare, odată ce "zz" nu
este declarat încă.)
-
în linia 5, referința la caracter, "<" este expandată imediat,
iar entitatea parametru "zz" este stocată cu textul de înlocuit "<!ENTITY
tricky "error-prone" >", ce este o declarație de entitate bine formată.
-
în linia 6, referința la "xx" este recunoscută, iar textul de înlocuit
al lui "xx" (numit "%zz;") este parsat. Referința la "zz" este recunoscută
la rândul ei, iar textul ei de înlocuit ("<!ENTITY tricky "error-prone"
>") este parsat. Entitatea "tricky" generată a fost acum declarată, cu
textul de înlocuit "error-prone".
-
în linia 8, referința la entitatea generală "tricky" este recunoscută și
expandată, deci întregul conținut al elementului "test" este textul care
se descrie (negramatical) This sample shows a error-prone method.
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".
-
00 00 00 3C: UCS-4, o mașină ce utilizează sistemul big-endian (ordinea
1234)
-
3C 00 00 00: UCS-4, o mașină ce utilizează sistemul little-endian (ordinea
4321)
-
00 00 3C 00: UCS-4, o ordine a octeților neobișnuită (2143)
-
00 3C 00 00: UCS-4, o ordine a octeților neobișnuită (3421)
-
FE FF: UTF-16, big-endian
-
FF FE: UTF-16, little-endian
-
00 3C 00 3F: UTF-16, big-endian, fără marcaj al ordinii octeților (și astfel,
vorbind strict, avem o eroare)
-
3C 00 3F 00: UTF-16, little-endian, fără marcaj al ordinii octeților (și
astfel, vorbind strict, avem o eroare)
-
3C 3F 78 6D: UTF-8, ISO 646, ASCII, o parte a ISO 8859, Shift-JIS, EUC
sau alte codificări de 7 sau 8 biți sau mixaje ale mărimii, ce ne asigură
că caracterele ASCII se află în poziția lor, cu mărimea și cu valorile
normale;declarația codificării trebuie citită pentru a afla care dintre
codificări este utilizată, dar odată ce toate aceste codificări utilizează
aceleași modele de biți pentru caracterele ASCII, declația de codificare
poate fi citită corect
-
4C 6F A7 94: EBCDIC (în câteva forme; întreaga declarație de codificare
trebuie citită pentru a ști care cod de paginiă este utilizat)
-
alții: UTF-8 fără o declarație de codificare sau fluxul de date este corupt,
fragmentat sau pus într-o formă de un anumit tip
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.
-
dacă o entitate XML este într-un fișier, atunci marcajul ordinii octeților
și instrucțiunea de procesare cu declarația de codificare (dacă este
prezentă) sunt utilizate pentru a determina codificarea caracterelor. Toate
celelalte euristice și surse de informare vor fi prezente doar pentru recuperarea
erorilor.
-
Dacă o entitate XML este trimisă cu un tip MIME, text/xml, atunci parametru
charset din tipul MIME va determina metoda de codificare a caracterelor;
toate celelalte euristice și surse de informare vor fi prezente doar pentru
recuperarea erorilor.
-
Dacă o entitate XML este trimisă cu un tip MIME, aplication/xml, atunci
marcajul ordinii octeților și instrucțiunea de procesare cu declarația
de codificare (dacă este prezentă) sunt utilizate pentru a determina codificarea
caracterelor. Toate celelalte euristice și surse de informare vor fi prezente
doar pentru recuperarea erorilor.
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