(Languages: be de en id pl ru-1 ru-2 sr-cryl sr-latn uk)
(This page uses CSS style sheets)
The CSS2 Recommendation contains a brief tutorial on using CSS with XML (see за2.2). At the time CSS2 was written the official specification for style in XML wasn't ready. Here is what that tutorial should have contained. Note that the examples use CSS, but in most cases the style rules can also be written in XSL.
Tip: try it in your browser
HTML has a link element
to link to external style sheets, but not every XML-based format will have
such an element. If there is no suitable element, you can still attach
external style sheets by means of the xml-stylesheet
processing instruction like this:
<?xml-stylesheet href="my-style.css" type="text/css"?> ... rest of document here...
This processing instruction (PI) must come before the first tag of the
document. The type="text/css" is not required, but it
helps the browser: if it doesn't support CSS, it knows it won't have to
download this file.
Just as with the link element of HTML, there can be multiple
xml-stylesheet PIs and they can have attributes to set the type,
medium and title.
Here is a larger example. Let's assume we have three style sheets, one that sets the basic display type of each element (inline, block, list-item, etc.) and two different ones that each set colors and margins. The two last ones are each other's alternative, and the reader of the document may choose which one to use. Except when the document is printed, in which case we only want to use the last style. Here is the common style sheet:
/* common.css */
INSTRUMENT { display: inline }
ARTICLE, HEADLINE, AUTHOR, PARA { display: block }
This is one of the alternative styles, in a file called "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 }
And here is the other one, called "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 }
The XML document with these three style sheets linked to it looks like this:
<?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>
For more details, see the W3C Recommendation “Associating Style Sheets with XML documents”
Tip: try it in your browser
HTML has a style element that allows the style
sheet(s) to be embedded directly in the HTML file, without the need for an
external file. In some cases that is easier, especially when the style sheet
is very specific to that document.
Most XML-based formats will not have such an element, but the same PI that links to external style sheets can also be used to point to style sheets that are embedded in the document itself. As of February 2006, there are still technical problems with this and no formal specification exists. For example:
<?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 this case the type="text/css" attribute must be present,
otherwise the browser (or other program) has to guess the style sheet
language. The xml-stylesheet PI now points not to an external
style sheet, but to an element of the document itself. That element is
identified by an id attribute that serves as the target of the
link. (Depending on the particular XML format, the id
attribute may be called something else; in some formats there may not
be a suitable attribute at all.)
The W3C Recommendation “Associating Style Sheets with XML documents” doesn't define the case of embedded style sheets, although it seems a reasonable extrapolation to allow URL fragments (starting with a “#”). At this time, early 2006, there are still unsolved problems and there is no published specification. The problems are as follows:
type attribute is required
in this case. It is undefined what happens if the attribute is
omitted: is the style sheet ignored? is it assumed to be CSS? is there
some algorithm to determine the language?
<ARTICLE> is not correct CSS, so
it seems there needs to be an extra rule that a fragment identifier
used in a style sheet PI points to the contents of an element, not to
the element itself.
type attribute only gives the type of one of the two
and thus the browser cannot know if it is able to use the style sheet.
It is not even defined whether the type attributes gives
the type of the external document or of the style sheet embedded in
it.
xml:id and if
the document contains attributes of that name, it is very likely that
the URL fragment points to one of those. But if there are no such
attributes, the browser must try other means to determine which
attributes are IDs. If the document has a DOCTYPE at the top and the
browser is able to retrieve the DTD that it points to, that DTD will
specify the attribute. But browsers may not be able to read DTDs or
there may not be a DOCTYPE.
HTML also allows styles to be attached directly to individual elements by
means of the style
attribute. Most XML-based document formats will not have such an
attribute, although some may allow features (modules) from HTML to be
used inside the document.
Tip: try it in your browser
The class
attribute that allows you to create subclasses of elements in
HTML is also not likely to be available in the majority of XML-based
document formats. Of course, CSS lets you select elements based on any
attribute, not just class, but the syntax is less
convenient.
Here is an example. If there is a class attribute and
the document format defines that it works like in HTML, we can use
the notation with the dot. (Therefore, this particular example won't
work, because <doc> is not a format that browsers know as
something that has 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>
If the document format doesn't specify that class creates a
subclass, then you'll have to use the longer selectors with "[ ]":
<?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>
If there is no class attribute, but there is something else we
can use, the attribute selectors "[ ]" still apply:
try it in your browser
<?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>