Cum sa adaugam stil in XML
(traducere «How to add style to XML»)

(This page uses CSS style sheets)

Stiluri

Unele utilizare?

Externe

CSS

Incorporate

XSL

Acest document este o traducere a How to add style to XML si poate contine erori de traducere. Originalul in limba engleza al acestui document este singura versiune normativa. Autorul traducerii: Maryna Molchanova [email protected]


Recomandarea CSS2 contine un scurt indreptat de utilizare CSS cu XML (a se vedea. § 2.2). La momentul scrierii CSS2 specificatiile oficiale legate de tabelul cu acte XML nu erau gata. Iata ceea ce ar fi trebuit sa contina indreptarul. Observati faptul ca toate exemplele utilizeaza CSS, in majoritatea cazurilor insa regulile de stil pot fi scrise de asemenea si in XSL.

Tabelele externe ale stilurilor

Sfat: verificati aceasta in brawserul Dvs..

In HTML exista elementul link pentru conexiune cu tabelele externe ale stilurilor, dar nu oirce format bazat pe XML va avea un astfel de element. In cazul in care nu exista un element corespunzator, Dvs. puteti conecta tabelele externe ale stilurilor cu mijloacele din instructiunile de prelucrare  xml-stylesheet:

<?xml-stylesheet href="my-style.css" type="text/css"?>
... cealalta parte a documentului...

Aceste instructiuni de prelucrare trebuie sa se amplaseze pana la primul tag in document.type="text/css" nu este obligatoriu, acest lucru insa va ajuta brawserul, in caz ca nu suporta CSS, acesta va sti ca nu trebuie sa incarce acest fisier.

Ca si in cazul cu elementele link in HTML, instructiuni xml-stylesheet pot fi cateva, si acestea pot avea atribute pentru desemnarea tipului, amenajarii afisarii si titlului.

Iata un exemplu mai desfasurat. Sa presupunem ca avem trei tabele cu stil: unul care stabileste tipurile principale de afisare a fiecarui element (inline, block, list-item etc.), si alte doua tabele, care confera culorile si alineatele. Ultimele doua sunt alternative unul fata de celalalt si cititorul documentului poate alege pe care sa-l utilizeze. Cu exceptia cazului cand documentul se tipareste — atunci trebuie sa utilizam ultimul stil. Iata tabelul principal al stilurilor:

/* common.css */
INSTRUMENT { display: inline }
ARTICLE, HEADLINE, AUTHOR, PARA { display: block }

Iata unul dintre stilurile alternative, modern.css:

/* modern.css */
ARTICLE { font-family: sans-serif; background: white; color: black }
AUTHOR { margin: 1em; color: red }
HEADLINE { text-align: right; margin-bottom: 2em }
PARA { line-height: 1.5; margin-left: 15% }
INSTRUMENT { color: blue }

Iata alt stil, classic.css:

/* classic.css */
ARTICLE { font-family: serif; background: white; color: #003 }
AUTHOR { font-size: large; margin: 1em 0 }
HEADLINE { font-size: x-large; margin-bottom: 1em }
PARA { text-indent: 1em; text-align: justify }
INSTRUMENT { font-style: italic }

Documentul XML cu cele trei stiluri conectate arata aproximativ astfel:

<?xml-stylesheet href="common.css" type="text/css"?>
<?xml-stylesheet href="modern.css" title="Modern" media="screen"
  type="text/css"?>
<?xml-stylesheet href="classic.css" alternate="yes"
  title="Classic" media="screen, print" type="text/css"?>
<ARTICLE>
  <HEADLINE>Fredrick the Great meets Bach</HEADLINE>
  <AUTHOR>Johann Nikolaus Forkel</AUTHOR>
  <PARA>
    One evening, just as he was getting his 
    <INSTRUMENT>flute</INSTRUMENT> ready and his
    musicians were assembled, an officer brought him a list of
    the strangers who had arrived.
  </PARA>
</ARTICLE>

Pentru informatii suplimentare va rugam sa vizionati Recomandarile W3C „Conectarea tabelelor stilurilor cu documentele XML”.

Tabelele incorporate ale stilurilor

Sfat: verificati aceasta in brawserul Dvs..

In HTML exista atributul style care permite tabelelor stilurilor sa se incorporeze in fisier in mod direct, fara a fi necesar un fisier extern. In unele cazuri este mai simplu, indeosebi daca tabelul stilurilor este creat special pentru respectivul document.

Majoritatea formatelor bazate pe XML nu au un asemenea element, dar instructiunile asemanatoare de prelucrare, care se refera la tabelul extern al stilurilor, pot fi utilizate de asemenea pentru indicarea stilurilor incorporate in document. La momentul lunii februarie din anul 2006 exista inca probleme tehnice in acest sens si nu exista specificatii formale. Exemplu:

<?xml-stylesheet href="#style" type="text/css"?>
<ARTICLE>
  <EXTRAS id="style">
    INSTRUMENT { display: inline }
    ARTICLE, HEADLINE, AUTHOR, PARA { display: block }
    EXTRAS { display: none }
  </EXTRAS>
  <HEADLINE>Fredrick the Great meets Bach</HEADLINE>
  ...
</ARTICLE>

In acest caz atributul type="text/css" trebuie sa fie prezent, in caz contrar brawserul (sau alt program) va trebui sa presupuna cu privire la limba tabelelor stilurilor. Instructiunile xml-stylesheet arata acum nu tabelul extern al stilurilor, ci elementul documentului insusi. Elementul este determinat de atributul id, care se transmite ca scop al link-ului. (In functie de formatul concret XML, atributul id poate fi numit altfel; in unele formate poate sa nu exista in general atributul corespunzator.)

Problemele deschise

Recomandarea W3C „Conectarea tabelelor stilurilor cu documentele XML” nu determina cazul tabelelor incorporate ale stilurilor, desi permisiunea URL partiale, care incep cu #, pare a fi o generalizare convenabila. La momentul inceputului anului 2006, inca mai pot fi probleme nesolutionate, si nu exista specificatii publicate:

  1. Pentru ca tabelul incorporat al stilurilor nu se incarca separat de pe site, serverul nu-i poate indicat brawserului, ce format are. De aceea in acest caz este necesar atributul type. Nu s-a determinat ce se va intampla, daca atributul este omis: va fi oare ignorat tabelul stilurilor? Se va considera oare CSS? Exista oare un oarecare algoritm de determinare a limbii?
  2. In majoritatea formatelor XML identificatorul partial confera elementul deplin si nu continutul elementului. Insa tabelul stilurilor, care incepe cu <ARTICLE>, nu este un cod exact CSS, de aceea este necesara o regula deosebita, conform careia identificatorul partial in instructiunile de stil de prelucrare arata continutul elementului si nu elementul in sine.
  3. In mod similar nu s-a determinat ce se va intampla in cazul in care elementul tinta are noduri filiale. Oare va fi constituit tabelul stilurilor din continutul complet al tuturor elementelor conectate? …doar din continutul primului element? …sau va fi eroare si elementul in intregime trebuie ignorat?
  4. In exemplul de mai sus URL indica insusi documentul. Sa presupunem ca URL indica fragmentul documentului external. Pentru a obtine cu succes tabelul stilurilor, pentru inceput brawserul trebuie sa incarce si sa prelucreze documentul extern, iar apoi sa extraga si sa prelucreze tabelul stilurilor. Dar atributul type indica doar unul dintre doua tipuri, de aceea brawserul nu poate sti, daca poate utiliza tabelul stilurilor. Nu s-a determinat nici macar daca atributele type indica tipul documentului extern, sau tabelul stilurilor incorporat in acesta
  5. Instructiunile de prelucrare a tabelelor stilurilor este mai folositoare cu XML general (Generic XML), adica cu marcajul formatului necunoscut brawserului. Datorita tabelului stilurilor, este posibil macar sa se reflecte ceva. Formatele cunoscute, precum SVG, SMIL sau XHTML, au regulilor proprii de prelucrare, care depasesc limitele a ceea ce poate determina stilurile. Exista insa si alte lucruri, pe care brawserul poate sa nu le cunoasca, daca documentul se prelucreaza ca si XML general: indeosebi acesta nu cunoaste, care atribute sunt identificatori. Exista Recomandarea W3C pentru atribute, denumita xml:id, si daca documentul contine atribute cu acest nume, atunci, cel mai probabil, URL partiale indica unul dintre acestea. In cazul in care nu exista astfel de atribute, brawserul trebuie sa incerce sa determine prin alte mijloace, care atribute sunt ID. In cazul in care documentul are la inceput DOCTYPE, si brawserul este capabil sa obtina DTD, spre care indica, acest DTD va indica atributul. Insa brawserele pot fi incapabile sa citeasca DTD, sau poate sa nu existe DOCTYPE.
  6. Identificarea fragmentului este doar unul dintre mijloacele de a indica elementul documentului. Alta recomandare W3C propune utilizarea   XPointer. Insa cunoasterea acestei tehnologii nu se cere acum brawserelor, care utilizeaza instructiunile de prelucrare a tabelului stilurilor, astfel incat nu este clar, daca brawserele pot intelege XPointer sau ele pot sau trebuie sa ignore aceasta.

Stilurile incorporate

HTML permite de asemenea utilizarea stilurilor in mod direct fata de unele elemente separate cu ajutorul atributului style. Majoritatea formatelor XML nu au un astfel de atribut, cu toate ca unele pot permite utilizarea posibilitatilor HTML (module) in document.

Atributele claselor

Sfat:verificati aceasta in browserul Dvs..

Atributul class, care permite crearea subclaselor de elemente in HTML, este de asemenea inaccesibil in formatele principale care se bazeaza pe XML. Bineinteles, CSS va permite sa alegeti elementele, bazandu-va pe orice atribut, nu doar pe class, dar sintaxa este mai putin comoda.

Iata un exemplu. Daca exista atributul class, si forma actului determina, ca acesta functioneaza ca si in HTML, se poate utiliza notatia cu punct. (In mod efectiv acest exemplu nu functioneaza, pentru ca <doc> — nu este acel format, pe care brawserul il va considera ca fiind ceva care suporta class)

<?xml-stylesheet href="#s1" type="text/css"?>
<doc>
  <s id="s1">
    s { display: none }
    p { display: block }
    p.note { color: red }
  </s>
  <p>Some text... </p>
  <p class="note">A note... </p>
</doc>

Daca documentul nu determina ca class creeaza o subclasa, Dvs. trebuie sa utilizati selectori mai lungi cu "[ ]":

<?xml-stylesheet href="#s1" type="text/css"?>
<doc>
  <s id="s1">
    s { display: none }
    p { display: block }
    p[class~=note] { color: red }
  </s>
  <p>Some text... </p>
  <p class="note">A note... </p>
</doc>

Daca nu exista nici atributul class, dar exista ceva ce poate fi utilizat, selectorii atributelor "[ ]" pot fi de asemenea utilizati:

Sfat: verificati aceasta in brawserul Dvs.

<?xml-stylesheet href="#s1" type="text/css"?>
<doc>
  <s id="s1">
    s { display: none }
    p { display: block }
    p[warning="yes"] { color: red }
  </s>
  <p>Some text... </p>
  <p warning="yes">A note... </p>
</doc>
Bert Bos
Created 29 February 2000 (last update: $Date: 2010/07/16 12:44:31 $)