W3C

Bert Bos | Namespaces (Future CSS, Utrecht 2013)

Namespaces

(Namespaces)

Cascading Style Sheets

XML-namespaces

Voor XML documenten met elementen met dezelfde naam maar verschillende betekenis

<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
 <rdf:Description rdf:about=''>
  <type xmlns='http://purl.org/dc/elements/1.1/'>image</type>
  <type xmlns='http://example.com/events/'>party</size>
 </rdf:Description>
</rdf:RDF>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
   xmlns:a='http://purl.org/dc/elements/1.1/'
   xmlns:b='http://example.com/events/'>
 <rdf:Description rdf:about=''>
  <a:type>image</type>
  <b:type>party</size>
 </rdf:Description>
</rdf:RDF>

Selecteren op Namespace kan nodig zijn voor XML-documenten met een combinatie van elementen uit verschillende formaten. RDF en XSLT zijn voorbeelden van formaten waarin altijd elementen uit twee of meer vocabulaires voorkomen (maar RDF en XSLT worden zelden met CSS opgemaakt).

HTML5 maakt ook gebruik van XML Namespaces, hoewel het geen XML-formaat is. (XHTML5 is wel XML, en gebruikt ze natuurlijk ook.) Er zijn momenteel in HTML5 maar drie Namespaces mogelijk; HTML zelf, SVG en MathML. SVG en HTML hebben inderdaad een paar elementen met dezelfde naam (a, title, font, script), hoewel ze nooit in dezelfde context voorkomen.

Maar namespaces werken in alle browsers, dus mocht je het nodig hebben, het is beschikbaar.

De twee fragmenten hierboven zijn equivalent onder de regels van XML, dus een oplossing m.b.v. een attribuut-selector [xmlns=...] werkt niet.

Gebruik in CSS

Definieer de gebruikte Namespaces:

@namespace dc url(http://purl.org/dc/elements/1.1/);
@namespace ev url(http://example.com/events/);

Gebruik ze in selectors:

dc|type {color: green}
ev|type {font-size: x-large}

De prefix in XML is arbitrair en onvoorspelbaar zodra het document door verschillende XML-processen is bewerkt. Er is ook niet altijd een prefix: de Namespace kan ook geërfd worden van het ouder-element.

De prefix in CSS is eveneens willekeurig te kiezen door de auteur van de stijl. Hij hoeft dus niet gelijk te zijn aan de prefix in XML.

Andere mogelijkheden

Het is mogelijk een default Namespace te definiëren voor alle elementen in een stylesheet, met @namespace url(...) Als een stylesheet geen default Namespace heeft, dan is *|foo hetzelfde als foo

Elementen in XML zonder expliciete Namespace erven de Namespace van hun ouder. Maar dat geldt niet voor attributen: Attributen in XML zonder expliciete Namespace hebben geen Namespace. (De XML-standaard zegt dat ze in een anonieme Namespace zitten die bestaat uit alle attributen van het element waarop ze zich bevinden.)

Dat betekent dat [|foo] en [foo] per definitie hetzelfde betekenen.

Einde

Terug naar agenda