It's sometimes useful to divide up your elements and attributes into groups, or namespaces . A namespace is to an element somewhat as a surname is to a person. You may know three people named Mike, but no two of them have the same last name. To illustrate this concept, look at the document in Example 2-2.
Example 2-2. A document using namespaces
<?xml version="1.0"?> <report> <title>Fish and Bicycles: A Connection?</title> <para>I have found a surprising relationship of fish to bicycles, expressed by the equation <equation>f = kb+n</equation>. The graph below illustrates the data curve of my experiment:</para> <chart xmlns:graph="http://mathstuff.com/dtds/chartml/"> <graph:dimension> <graph:axis>fish</graph:axis> <graph:start>80</graph:start> <graph:end>99</graph:end> <graph:interval>1</graph:interval> </graph:dimension> <graph:dimension> <graph:axis>bicycle</graph:axis> <graph:start>0</graph:start> <graph:end>1000</graph:end> <graph:interval>50</graph:interval> </graph:dimension> <graph:equation>fish=0.01*bicycle+81.4</graph:equation> </graph:chart> </report>
Two namespaces are at play in this example. The first is the default namespace, where elements and attributes lack a colon in their name. The elements whose names contain graph: are from the "chartml" namespace (something we just made up). graph: is a namespace prefix that, when attached to an element or attribute name, becomes a qualified name. The two <equation> elements are completely different element types, with a different role to play in the document. The one in the default namespace is used to format an equation literally, and the one in the chart namespace helps a graphing program generate a curve.
A namespace must always be declared in an element that contains the region where it will be used. This is done with an attribute of the form xmlns:prefix=URL, where prefix is the namespace prefix to be used (in this case, graph:) and URL is a unique identifier in the form of a URL or other resource identifier. Outside of the scope of this element, the namespace is not recognized.
Besides keeping two like-named element types or attribute types apart, namespaces serve a vital function in helping an XML processor format a document. Sometimes the change in namespace indicates that the default formatter should be replaced with a kind that handles a specific kind of data, such as the graph in the example. In other cases, a namespace is used to "bless" markup instructions to be treated as meta-markup, as in the case of XSLT.
Namespaces are emerging as a useful part of the XML tool set. However, they can raise a problem when DTDs are used. DTDs, as we will explain later, may contain declarations that restrict the kinds of elements that can be used to finite sets. However, it can be difficult to apply namespaces to DTDs, which have no special facility for resolving namespaces or knowing that elements and attributes that fall under a namespace (beyond the ever-present default one) are defined according to some other XML application. It's difficult to know this information partly because the notion of namespaces was added to XML long after the format of DTDs, which have been around since the SGML days, was set in stone. Therefore, namespaces can be incompatible with some DTDs. This problem is still unresolved, though not because of any lack of effort in the standards community.
Chapter 10, "Coding Strategies" covers some practical issues that emerge when working with namespaces.
Copyright © 2002 O'Reilly & Associates. All rights reserved.