Page content

Index of parts:
WHY do we need namespaces?
What? (the heck do you mean)
What is a namespace?
How do I use a namespace?
Multiple Namespaces
The Default namespace
Attributes and Namespace
What do I put at the end a namespace URI?

WHY do we need namespaces?

There are really two fundamental needs for namespaces:
To disambiguate between two elements that happen to share the name name
To group elements relating to a common idea together

What?

OK, so these statements are a bit vague - lets give some examples here:

To disambiguate between elements that happen to share the same name:

So: how do you tell an SVG title from an (x)html one?

To group elements relating to a common idea together:

My own XML-based data may have validating rules, and I will want to define those rules in the same place, and differentiate these particular rules from any other rule-set I (or someone else) define.

What is a namespace?

A namespace is a unique URI (Uniform Resource Locator)

The advantage of this format is that anyone who is transmitting XML can be assumed to have access to a domain name (the bit after the http://, but before the next /.

It is bad form to piggy-back on someone elses domain (especially is they don't know you're doing it!)

In an XML document, the URI is assocciated with a prefix, and this prefix is used with each element to indicate which namespace the element belongs to. eg:
rdf:description
xsl:template
zblsa:data
The terms are:
The part before the colon is the prefix
The part after the colon is the Local part
The a prefixed element is a qualified name
The an un-prefixed element is an unqualified name

How do I use a namespace?

To use a namespace, you first assocciate the URI with a namespace:
<foo:tag xmlns:foo="http://me.com/namespaces/foofoo">.

This defines foo as the prefix for the namespace for the element tag.

The attribute prefixed with xmlns is like a command to say link the following letters to a URI. As no well-formed document can contain two identical attributes, the bit after the colon stops the same prefix being defined twice at the same time.

Here is an example:

Defining one prefix for a namespace:

<foo:tag xmlns:foo="http://me.com/namespaces/foofoo">

  <foo:head>
    <foo:title>An example document</foo:title>
  </foo:head>

  <foo:body>
    <foo:e1>a simple document</foo:e1>
    <foo:e2>
      Another element
    </foo:e2>
  </foo:body>
</foo:tag>

For all elements within <foo:tag>, the namespace prefix foo is assocciated with the namespace URI http://me.com/namespaces/foofoo.

Different prefix, same namespace:

It is, therefor, possible for different prefixes to actually refer to the name namespace:

Defineing more than one prefix of the same namespace :

<tag>

  <foo:head xmlns:foo="http://me.com/namespaces/foofoo">
    <foo:title>An example document</foo:title>
  </foo:head>

  <bar:body xmlns:bar="http://me.com/namespaces/foofoo">
    <bar:e1>a simple document</bar:e1>
    <bar:e2>
      Another element
    </bar:e2>
  </bar:body>
<tag>

This

Same prefix, different namespaces:

It is also possible for the same prefix refer to different namespaces depending on the context

The same prefix, different namespace:

<myns:html xmlns:myns="http://www.w3c.org/1999/xhtml">

<myns:head>
	<myns:title>A really bad idea</myns:title>
</myns:head>

<myns:body>
  <myns:h1>A really bad idea</myns:h1>
    <myns:pre>
      <myns:pre xmlns:myns="http://my.com/namespaces/test-data">
        <myns:table>
          <myns:data>
            Hello World
          </myns:data>
        </myns:table>
      </myns:pre>
   </myns:pre>
</myns:body>
NOTE: THIS IS NOT A GOOD IDEA!

Multiple Namespaces

If you are using namespaces, you will almost certainly need to use several namespaces at once, so how do you declare more than one namespace at a time?

What you do is use more than one xmlns declaration:

Defining more than one namespace:

<foo:tag xmlns:foo="http://me.com/namespaces/foofoo"
         xmlns:bar="http://me.com/namespaces/foobar"
         >

  <foo:head>
    <foo:title>An example document</foo:title>
  </foo:head>

  <bar:body>
    <bar:e1>a simple document</bar:e1>
    <bar:e2>
      Another element
    </bar:e2>
  </bar:body>
</foo:tag>

The Default namespace

Question: If you use any namespaces, do all elements have to exist in a namespace?

Answer: Yes, but this may not be a problem:

It is permissable to define a namespace that is associated with no prefix, ie with unqualified names.

This is of particular importance for xhtml, as one of the requirements is that xhtml does not break HTML, and HTML does not understand prefixes!
To define the default namespace, simply allocate an xmlns with no prefix:
<xhtml xmlns="http://www.w3c.org/1999/xhtml">
Defining a default namespace:

<html xmlns="http://www.w3c.org/1999/xhtml"
      xmlns:bar="http://me.com/namespaces/foobar"
      >

  <head>
    <title>An example document</title>
  </head>

  <body>
    <bar:e1>a simple document</bar:e1>
    <bar:e2>
      Another element
    </bar:e2>
  </body>
</html>

Attributes and Namespace

For any specific element, an attribute may only exist once. This makes attributes slightly different to elements.

Attributes may be placed in a specific namespace ( <.... myns:myattib="foo" ...>), or the may be left unqualified.

The normal "rule" for Attributes is to put them in a namespace only if they are defined in a particular namespace (such as xlink or rdf attributes).

Attributes that have no namespace prefix are not in any namespace. Note: this is not the same as being the in the default namespace.

Attributes in namespaces only becomes important if you require the document to conform to a DTD or Schema - and the schemata defines the attribute as being qualified.

What do I put at the end a namespace URI?

Nothing

Ok, so this isn't really helpful. The problem here is that humans see a URL, so they want to point their web-browser at it and see what they get. This is purely a human thing, and is a consiquence of the choice of standardising on URIs for namespaces.

To quote Claude L. Bullard (from the XML-Dev email list):
The flaw is the conflation of name, location and identity but that flaw is the basic feature by which the WWW runs so we are stuck there. All the handwaving about URN/URI/URL doesn't avoid the simple fact that if one puts http:// anywhere in browser display space, the system colors it blue and puts up a finger.
The monkey expects a resource and when it doesn't get one, it shocks the monkey. Monkeys don't read specs to find out why they should be shocked. They turn red and put up a finger.
(Thanks to Elliotte Rusty Harold for finding it)

What many people do is place an document there, describing the namespace

A new idea emerging from XML-dev is RDDL (the Resource Directory Description Language).


[an error occurred while processing this directive]

A page from lucas.ucs.ed.ac.uk

Page title: XML and Namespaces, a brief introduction