XML Namespaces
XML Namespaces provide a method to avoid element name
conflicts.
Name Conflicts
Since element names in XML are not predefined, a name conflict will occur
when two different documents use the same element names.
This XML document carries
information in a table:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
|
This XML document carries information about a table (a piece of furniture):
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
|
If these two XML documents were added together, there would be an element name
conflict because both documents contain a <table> element with different
content and definition.
Solving Name Conflicts Using a Prefix
This XML document carries information in a table:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
|
This XML document carries information about a piece of furniture:
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
|
Now there will be no name conflict because the two documents use a
different name for their <table> element (<h:table> and <f:table>).
By using a prefix, we have created two different types of <table>
elements.
Using Namespaces
This XML document carries information in a table:
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
|
This XML document carries information about a piece of furniture:
<f:table xmlns:f="http://www.w3schools.com/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
|
Instead of using only prefixes, we have added an xmlns attribute to
the <table> tag to give the prefix a qualified name associated
with a namespace.
The XML Namespace (xmlns) Attribute
The XML namespace attribute is placed in the start tag of an element and has the following syntax:
xmlns:namespace-prefix="namespaceURI"
|
When a namespace is defined in the start tag of an element, all child
elements with the same prefix are associated with the same namespace.
Note that the address used to identify the namespace is not used by the
parser to look up information. The only purpose is to give the namespace a
unique name. However, very often companies use the namespace as a pointer to a
real Web page containing information about the namespace.
Try to go to http://www.w3.org/TR/html4/.
Uniform Resource Identifier (URI)
A Uniform Resource Identifier (URI) is a string of characters which
identifies an Internet Resource. The most common URI is the Uniform Resource
Locator (URL) which identifies an Internet domain address. Another, not so
common type of URI is the Universal Resource Name (URN). In our examples
we will only use URLs.
Default Namespaces
Defining a default namespace for an element saves us from using prefixes in
all the child elements. It has the following syntax:
This XML document carries information in a table:
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
|
This XML document carries information about a piece of furniture:
<table xmlns="http://www.w3schools.com/furniture">
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
|
Namespaces in Real Use
When you start using XSL, you will soon see namespaces in real use. XSL style
sheets are used to transform XML documents into other formats, like HTML.
If you take a close look at the XSL document below, you will see that most of the
tags are HTML tags. The tags that are not HTML tags have the prefix xsl,
identified by the namespace "http://www.w3.org/1999/XSL/Transform":
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr>
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
|
|