Ok lets put this into context, and initially go back to basics:
When you have an XML parser sitting there and parsing XML documents coming its way, it needs a way to identify its own and potentially other peoples XML tags in order to extract the information relevant to it.
The namespace will uniquely identify the tags that are relevant to its and other peoples XML data in order for it to internally process or disregard that data. In order to uniquely identify namespaces, you need a URI.
For example, two nodes can be labelled "reference-number", and may at some time be in the same document. One node "reference-number" could belong to a library system, which could mean that this node contains a reference to the shelf number and location of a book. The other node "reference-number" could belong to the same companies online billing or tracking system which lends books from the library over the internet and refers to the customers reference number. In order to identify these two nodes you need a namespace. Therefore nodes can be identified completely by the namespaces "billing:reference-number" and "library:reference-number".
Ok imagine now, that all of librarysonline.com's accounts are audited through a third company call "Just Accounting". Their XML documents can also contain a node called "reference-number". They also have a namespace "billing" ("billing:reference-number"

.
We now have a conflict with the two identical namespaces when the accounts of librarysonline.com were processed by the systems in justaccounting.com's system. How would a system know whether "billing:reference-number" came from librarysonline or justaccounting? How would we process two completely different reference numbers?
The problem is solved if we identify one "billing" namespace with the URI "librarysonline.com" and the other "billing" namespace with the URL "justaccounting.com". Then we will inherently know that the librariesonline tag needs to be ignored (or processed differently!) by the justaccounting system just by looking at the namespace URI.
The URI uniquely identifies this in each namespace at each use of the node "billing:reference-number" in the XML Document so that each system can read and process it correctly.
Phew
So to answer your question, the URI uniquely identifies the namespace its self, and that uniquely qualified namespace uniquely identifies the tagname within the context of multiple systems.
Try this in any parser. Enter this XML:
<overall-document>
<library xmlns:billing="
<billing:reference-number>
23
</billing:reference-number>
</library>
<justaccounting xmlns:billing="
<billing:reference-number>
23.34
</billing:reference-number>
</justaccounting>
</overall-document>
and then use this stylesheet to transform it:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="
>
<xsl:template match="/" xmlns:billing="
<xsl:value-of select="//billing:reference-number"/>
</xsl:template>
</xsl:stylesheet>
Notice that only the value 23 is printed out. Change the xmlns:billing parameter in the template to "
to print out the other value.
hope that helps a bit more
Matt