Kā pievienot XML stilu

(Šī lappuse izmanto CSS kaskādes stilu tabulas)

Minētais dokuments ir raksta "How to add style to XML".
Dokumenta oriģinālā versija ir piejama tikai W3C saitā http://www.w3.org/Style/styling-XML
Minētais tulkojums NAV oficiāls W3C documents.
Visas autortiesības pieder W3C.
Minētajā dokumentā var būt tulkojuma un drukas kļūdas.

Autors: Alexander Fristkins (autora visi tulkojumi)
Lokālā versija: http://www.reviews4u.org/Style/styling-XML.html

Stili

Kurš izmantot?

Arejais

CSS

Iebuvēts

XSL

CSS2 rekomendācijas satur īsu pamācību CSS lietošanā ar XML palīdzību (skat. § 2.2). CSS2 tapšanas laikā oficiālā stila specifikācija XML vidē vēl nebija gatava. Lūk, tas, ko pamācībai vajadzēja saturēt. Pievērsiet uzmanību, ka piemēri izmanto CSS, taču lielākajā daļā gadījumu stilu noteikumus var tāpat ierakstīt XSL.

ĀRĒJĀS STILU TABULAS

Uzvedne: pamēģiniet to jūsu pārlūkprogrammā

HTML satur elementu link дpiesaistei ārējai stilu tabulai, taču ne katram formātam uz XML bāzes būs tāds elements. Ja nav atbilstoša elementa, jūs varat pievienot ārējo stilu tabulu ar apstrādes instrukciju xml-stylesheet palīdzību sekojošā veidā:

<?xml-stylesheet href="my-style.css" type="text/css"?>
... dokumenta atlikums te...

Šīm apstrādes instrukcijām (AI) jābūt pirms dokumenta pirmā tega. type="text/css" nav nepieciešams, taču tas palīdz pārlūkprogrammai: ja tas neatbalsta CSS, tas zina, ka nevajadzēs ielādēt šo failu.

Līdzīgi kā gadījumā ar HTML elementu link, te var būt sarežģītas xml-stylesheet AI, un tām var būt atribūti tipa, satura un galvenes noteikšanai.

Lūk, izvērsts piemērs. Iedomāsimies, ka mums ir trīs stilu tabulas: pamata, kura nosaka katra elementa displeja bāzes tipu (līnijā, blokā, lapā utt.), un divas citas, katra no kurām nosaka krāsu un laukumus. Divas pēdējās ir viena otras alternatīva, un dokumenta lasītājs var izvēlēties, kuru no tām izvēlēties. Izņēmums ir gadījumi, kad dokuments tiek drukāts. Tad mēs vēlamies izmantot tikai pēdējo stilu. Lūk, pamata stilu tabula:

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

Tas ir viens no alternatīvajiem stiliem failā ar nosaukumu "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 }

Bet te, lūk, ir otrs, kas saucas "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 }

XML dokuments ar šiem trim, tam piesaistītajiem stiliem izskatās sekojoši:

<?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>

Detalizētākas informācijas gūšanai skatieties W3C rekomendācijas ““Stilu tabulu piesaiste XML dokumentam”

IEBŪVĒTĀS STILU TABULAS

Uzvedne: pamēģiniet to savā pārlūkprogrammā

HTML ir style, elements, kas ļauj iebūvēt stilu tabulu tieši HTML failā bez ārējā faila esamības nepieciešamības. Dažos gadījumos tā ir vienkāršāk, īpaši, kad stilu tabula ir ļoti specifiska konkrētajam dokumentam.

Lielākajai daļai uz XML balstīto formātu nebūs tāda elementa, bet tās pašas AI, kas piesaistās ārējai stilu tabulai, var tāpat tikt izmantotas, lai vērstos pie stilu tabulas, kas iebūvēta pašā dokumentā. 2006. gada februārī vēl joprojām eksistē tehniskas tā realizācijas problēmas, bet formālas specifikācijas neeksistē. Piemēram:

<?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>

Šajā gadījumā jābūt atribūtam type="text/css", pretējā gadījumā pārlūkprogramma (vai cita programma) būs spiesta minēt stilu tabulas valodu xml-stylesheet AI tagad vēršas nevis pie ārējās stilu tabulas, bet pie paša dokumenta elementa. Šis elements identificējas ar atribūtu id, kas kalpo par norādes mērķi. (Atkarībā no atsevišķa XML formāta, atribūts id var saukties citādi; dažos formātos vispār var nebūt atbilstošu atribūtu.)

Neatrisinātās problēmas

W3C rekomendācijas “Stilu tabulu piesaiste XML dokumentam” neizskata iebūvētās stilu tabulas gadījumu, lai gan šķiet pamatoti atļaut URL fragmentus (sākot no “#”). Tai pat laikā, 2006. gada sākumā, vēl joprojām pastāv neatrisinātas problēmas, pie kurām nav publicētu specifikāciju. Problēmas ir sekojošas:

  1. Tā iemesla dēļ, ka iebūvētā stilu tabula nav ielādējama atsevišķi no servera, serveris nevar pateikt pārlūkprogrammai to, kāds ir tabulas formāts. Šajā gadījumā ir nepieciešams atribūts type. Nav noteikts, kas notiek, kad atribūts tiek likvidēts: vai stilu tabula tiek ignorēta? vai tā var būt CSS? vai ir kāds algoritms valodas atpazīšanai?
  2. Lielākajā daļā uz XML balstīto formātu fragmentu identifikators nosaka pilnu elementu, nevis elementa saturu. Taču stilu tabula, kura sākas ar <ARTICLE> nav pareiza. Tādējādi var izdarīt secinājumu, ka ir nepieciešams kāds papildu noteikums, saskaņā ar kuru identifikators, kas tiek izmantots AI stilu tabulā, vērstos pie elementa satura, nevis paša elementa.
  3. Tāpat nav noteikts, kas notiek, ja elementa iekšienē ir „meitas” elementi, pie kuriem tas vēršas. Vai stilu tabula sastāv no koncentrēta visu elementu satura? tikai no pirmā elementa satura? vai arī tā ir kļūda, un viss elements tiek ignorēts?
  4. Augstākminētajā piemērā URL vērsās pie paša dokumenta. Fakts, ka pārlūkprogramma vispār varēs skatīties uz šo URL, rāda, ka tas zina, kā analizēt XML un, iespējams, ir spējīgs atrast nominālo stilu tabulu. Bet tagad iedomājieties URL, kas norāda uz ārējā dokumenta fragmentu. Lai veiksmīgi atjaunotu stilu tabulu, pārlūkprogrammai jāielādē un jāizanalizē ārējais dokuments un pēc tam jāizdabū un jāizanalizē stilu tabula. Bet atribūts type dod tikai vienu no diviem tipiem, tādēļ pārlūkprogramma nevar zināt, vai var izmantot stilu tabulu. Nav pat noteikts tas, vai atribūts type tiek uzdots ārējā dokumenta tipam vai tajā iebūvētajai stilu tabulai.
  5. AI stilu tabula galvenokārt tiek izmantota ar “Generic XML,” tas ir, formātā, kādu pārlūkprogramma nezina. Pateicoties stilu tabulai, tā spēs, mazākais, kaut ko atspoguļot. Pazīstamajiem formātiem, piemēram, SVG, SMIL vai XHTML, ir pašiem savi noteikumi atspoguļošanai, kuri iziet ārpus stilu tabulas iespēju rāmjiem. Taču ir citas lietas, ko pārlūkprogramma tāpat nezina, kad apstrādā dokumentu, kā Generic XML: lielākoties tā nezina, kādi atribūti ir ID atribūti. Atribūtiem ir W3C rekomendācijas ar nosaukumu xml:id, un, ja dokuments satur atribūtus ar šādu nosaukumu, visticamāk, ka URL fragments norādīt uz vienu no tiem. Bet, ja tādu atribūtu nav, pārlūkprogrammai jāmēģina citi paņēmieni, lai noteiktu, kuri ir ID atribūti. Ja dokumentam ir DOCTYPE augšā un pārlūkprogramma spēj atjaunot DTD, kas norāda uz to, šis DTD noteiks atribūtu. Taču pārlūkprogramma var netikt galā ar DTD lasīšanu vai arī var nebūt DOCTYPE.
  6. Fragmenta identifikators – vienīgais veids, kā norādīt uz elementu dokumentā. Citas W3C rekomendācijas nosaka XPointers elementu identifikācijai dokumentā bez ID atribūtu esamības nepieciešamības. Taču XPointers saprašana mūsdienās nav PI stilu tabulu izmantojošo pārlūkprogrammu prasība, tāpēc nav skaidrs, vai pārlūkprogramma spēs interpretēt XPointers, ja tās spēj vai tām tie ir jāignorē.

IEBŪVĒTIE STILI

HTML tāpat ļauj stiliem pievienoties tieši individuāliem elementiem ar atribūta style palīdzību. Vairumam uz XML balstītu dokumentu formātu nebūs tāda atribūta, lai gan daži var atļaut HTML īpašības (moduļi) izmantošanai dokumenta iekšienē.

Klases atribūti

Uzvedne: pamēģiniet to jūsu pārlūkprogrammā

class , atribūts, kas ļauj jums veidot elementu apakšklases HTML, tāpat nav pieejams lielākajā daļā formātu uz XML bāzes. Protams, CSS ļauj jums izvēlēties elementus, kas balstās uz jebkuru atribūtu, ne tikai class, taču sintakse nav tik ērta.

Lūk, piemērs. Ja ir class atribūts un dokumenta formāts nosaka, ka tas darbojas kā HTML, mēs varam izmantot norādes ar punktējumu. (Šis konkrētais piemērs nedarbosies, jo <doc> ir formāts, ko nepazīst pārlūkprogramma kā kaut ko tādu, kam ir 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>

Ja dokumenta formāts nenosaka, ka class veido apakšklasi, jums nāksies izmantot garākus tegu noteicēju ar "[ ]":

<?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>

Ja class nav, bet ir kaut kas cits, ko mēs varam izmantot, vienalga tiek izmantoti "[ ]" atribūtu tegu noteicēji:

pamēģiniet to savā pārlūkprogrammā

<?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: 2007/07/26 16:43:24 $)