Български превод на "How to add style to XML"

Настоящият документ е неофициален превод на статията "How to add style to XML".

Оригиналната версия на документа се намира само на уебсайта на W3C http://www.w3.org/Style/styling-XML.
Това НЕ е официален документ на W3C. Всички авторски права принадлежат на W3C.

Превод: Александър Дичев (към всички преводи).
Преводът е направен на 25.06.2008 и е обновен последно на 13.09.2010.

С подкрепата на Moon phase today и Balkans.

Как да добавим стил към XML

(Тази страница използва CSS style sheets)

Стилове

Кой трябва да използвам?

външен

CSS

вписан

XSL

CSS2 Препоръката съдържа кратко ръководство за използване на CSS с XML (виж § 2.2). По времето, когато CSS2 беше написан официалната спецификация за стил в XML не беше готова. Тук е това, което ръководството трябва да съдържа. Обърнете внимание, че се използва CSS, но в повечето случай правилата за стил могат да бъдат написани също и на XSL.

Външни style sheets

Съвет: пробвайте в браузъра си

HTML има link елемент за връзка към външни style sheets, но не всеки XML-базиран формат ще притежава такъв елемент. Дори да няма подходящ елемент, можете да прикрепите външни style sheets посредством xml-stylesheet инструкция за обработка както тук:

<?xml-stylesheet href="my-style.css" type="text/css"?>
... останалата част от документа тук...

Тази инструкция за обработка (PI - processing instruction) трябва да се намира преди първия таг на документа. type="text/css" не е задължително, но помага на браузъра: ако не поддържа CSS, знае, че не е необходимо да изтегля този файл.

Както и с link елемента в HTML, може да има и повече xml-stylesheet PI-та и те могат да имат атрибути за задаване на тип, медия и заглавие.

Ето и по-голям пример. Да приемем, че имаме три style sheets, един задаващ основния тип за изобразяване на всеки елемент (inline, block, list-item и т.н.) и два различни, които задават цветове и отстояния. Последните два са алтернативи един на друг и читателят на документа може да избере, кой от двата да използва. Изключение са случайте, в които принтираме, тогава искаме да използваме само последния стил. Ето един основен style sheet:

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

Това е един от алтернативните стилове, във файл с име "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 }

И вторият, наречен "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 документа, с който тези три стила ще бъдат свързани изглежда така:

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

За повече подробности, погледнете W3C Препоръката “Associating Style Sheets with XML documents”

Вписани style sheets

Съвет: пробвайте в браузъра си

HTML има елемента style, който позволява на style sheet(s) да бъдат вписани в HTML файл, без да се използва външен файл за това. В някои случаи това е по-лесно, особена когато style sheet е строго специфичен за този документ.

Повечето XML-базирани формати няма да притежават такъв елемент, но същата PI, която сочи връзка към външен style sheets, може да бъде използвана за посочване на style sheets, които са вписани в самия документ. От февруари 2006, все още има технически проблеми с това и няма формална спецификация. Например:

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

В този случай атрибутът type="text/css" трябва да присъства, иначе браузърът (или друга програма) трябва да познае style sheet езика. xml-stylesheet PI-та сега сочи не към външен style sheet, а към елемент в самия документ. Този елемент се идентифицира с id атрибут, който служи за цел на връзката. (В зависимост от конкретния XML формат, атрибутът id може да е наречен по друг начин; в някои формати е възможно изобщо да липсва подходящ атрибут.)

Нерешени проблеми

W3C Препоръката “Associating Style Sheets with XML documents” не определя случая с вписани style sheets, въпреки че изглежда разумно да се даде възможност за екстраполация на URL фрагменти (започващи с “#”). Към този момент, ранната 2006, все още съществуват нерешени проблеми и няма публикувана спецификация. Проблемите са следните:

  1. Тъй като вписан style sheet не се изтегля отделно от сървъра, сървърът не може да уведоми браузъра за формата на въпросния style sheet. Затова в такъв случай атрибутът type е задължителен. Не е дефинирано, какво се случва ако бъде пропуснат: дали style sheet се игнорира? дали се приема, че е CSS? има ли някакъв алгоритъм за установяване на езика?
  2. В повечето XML-базирани формати, идентификаторът за фрагмент определя цял елемент, а не съдържанието му. Но style sheet, който започва с <ARTICLE> не е правилен CSS, затова изглежда, че е необходимо допълнително правило, което идентификатор за фрагмент да използва в style sheet, като PI-та да сочи към съдържанието на елемента, а не към самия елемент.
  3. По подобен начин, не е дефинирано, какво се случва, когато има дъщерни елементи в самия посочен елемент. Дали style sheet съчетава съдържанието на цялата серия елементи? съдържанието или само първия елемент? или грешка ли е това и игнорира ли се целия елемент?
  4. В примера по-горе, URL-ът сочи в самия документ. Като цяло фактът, че браузърът успява да проследи този URL показва, че той знае, как да парсва XML и вероятно е способен да намери посочения стилов елемент. Но да приемем, че имаме URL, сочещ към фрагмент от външен документ. За да достигне успешно до style sheet, браузърът трябва първо да изтегли и парсне външния документ и след това да извлече и парсне самия style sheet. Но атрибутът type посочва типа само на единия от двата и браузърът не може да знае дали е възможно да използва style sheet-а. Не е дефинирано дори, дали атрибутът type посочва типа на външния документ или на вписания в него style sheet.
  5. PI на style sheet е най-полезна, при използване с “Generic XML,”, с други думи, с XML във формат, който браузърът не познава. Благодарение на style sheet-а, ще успее да покаже нещо. Добре известните формати като SVG, SMIL или XHTML, имат свои собствени правила за рендиране, които се простират до определянето на всичко, което style sheet може да дефинира.Но има неща, които браузърът не познава, когато документът е третиран като Generic XML: в частност, не се знае, кои атрибути са ID атрибути. Съществува W3C Препоръка за атрибутите, наречени xml:id и ако документът съдържа атрибути с такова име, е твърде възможно URL фрагмент да сочи към един от тях. Но ако няма такива атрибути, браузърът трябва да се опита да определи по друг начин, кои атрибути са ID. Ако документът има DOCTYPE в началото и браузърът успее да получи посочения в него DTD, този DTD ще определи атрибута. Но браузърите може да могат да четат DTD или да няма DOCTYPE.
  6. ID на фрагмент е само един от начините за посочване на елемент в документ. Друга W3C Препоръка дефинира XPointers за идентифициране на елементи в документ без необходимост от ID атрибут. Но разбирането на XPointers в момента не е задължително за браузърите използващи PI към style sheet и не е ясно дали браузърът ще интерпретира XPointer-и ако му е възможно или просто ще ги игнорира.

Контекстни (вградени) стилове

HTML позволява също стилове да се прикачват директно към индивидуални елементи с помощта на атрибута style. Повечето XML-базирани формати на документи няма да имат такъв атрибут, докато други ще позволяват функционалности (модули) от HTML да се използват в документа.

Клас атрибути

Съвет: пробвайте в браузъра си

Атрибутът class, който позволява създаването на подкласове от елементи в HTML, най-вероятно няма да функционира в повечето XML-базирани документни формати. Разбира се, CSS позволява посочването на елементи по всеки един атрибут, не само по class, но самия синтаксис е по-неудобрен.

Ето един пример. Ако има атрибут class и формата на документа дефинира, че работи като HTML, може да се използва означаването с точка. (Затова пък, този частен случай няма да работи, защото <doc> не е формат, които браузърите разпознават като нещо, което има 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>

Ако форматът на документа не определя, че class създава подклас, тогава се налага да се използват по-дългите селектори с "[ ]":

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

Ако няма атрибут class, но има нещо друго, което може да се използва, атрибутите-селектори "[ ]" отново важат:

пробвайте в браузъра си

<?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
Създадена на 29 февруари 2000 (последна промяна: $Date: 2010/07/16 12:44:31 $)