例えば、ワープロソフトを作成するとします。その保存形式は XML形式(独自の XML応用規格)になるかもしれません。例えば、以下のような文書になるかもしれません。
<?xml version="1.0" encoding="UTF-8"?> <document> <p>これは段落です。</p> <p color="red">これは第 2段落です。</p> </document>
さて、このワープロソフトに画像の挿入機能を追加するとします。挿入する画像は SVG形式とするとします。SVGは XML応用規格のひとつなので、上記の XML文書に取り込むことができます。具体的には以下のような形式になるかもしれません。
<?xml version="1.0" encoding="UTF-8"?> <document> <p>これは段落です。以下に画像を挿入します。</p> <svg width="640px" height="400px" version="1.1"> <rect x="50" y="50" width="250" height="100" fill="blue" /> <circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" /> </svg> <p color="red">これは第 2段落です。以下に画像を挿入します。</p> <svg width="640px" height="400px" version="1.1"> <rect x="50" y="50" width="250" height="100" fill="blue" /> <circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" /> </svg> </document>
この場合はこれで問題ないように思えます。XML文書としてのルールも満たしています。
しかし、このような記述の仕方では、ワープロ文書側が持つ要素と、SVG規格側がもつ要素を区別することができません。したがって、もしワープロ文書側に既に svgという名前の要素があった場合、あるいは rectや circleという名前の要素が存在した場合、ワープロ文書としての取り扱いが非常に複雑になります。逆に、SVG規格側が、もし、pや documentという名前の要素に意味を持たせていた場合も、取り扱いが複雑になります。
そして、この先、ワープロソフトをさらに機能向上していく過程で、さらに他の XML応用規格を取り込んでいく場合(例えば、数式や表を表現するための XML応用規格を使用するかもしれません)、それぞれの XML文書の要素の名前に重複がないように気をつけなければならないということになります。あるいは、要素の名前に重複がないことを祈るしかない、というようなことになりかねません。
このように、1つの XML文書の中に複数の XML規格を含めようとすると、要素名の重複の問題が発生します。この問題を解決するための概念が名前空間です。
名前空間を使用すると、要素が属する空間をそれぞれ指定することができます。先の例で言えば、ワープロ文書側と SVG規格が持つ要素が、まったく別のものであることを示すことができます。
名前空間を使用するための手順は以下のとおりです。
基本的な記述方法は以下のとおりです。
<別名:要素 xmlns:別名="URI"> <別名:子要素 属性名="属性値" /> … </別名:要素>
名前空間についての注意点は以下のとおりです。
先のサンプルに名前空間を適用すると、例えば、以下のような形式になります。なお、ワープロ文書側の名前空間を「http://www.test.com/xml/document/」とし、SVG側の名前空間は、SVG仕様に記述されているように「http://www.w3.org/2000/svg」を使用するとします。
<?xml version="1.0" encoding="UTF-8"?> <d:document xmlns:d="http://www.test.com/xml/document/"> <d:p>これは段落です。以下に画像を挿入します。</d:p> <s:svg xmlns:s="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1"> <s:rect x="50" y="50" width="250" height="100" fill="blue" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" /> </s:svg> <d:p color="red">これは第 2段落です。以下に画像を挿入します。</d:p> <s:svg xmlns:s="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1"> <s:rect x="50" y="50" width="250" height="100" fill="blue" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" /> </s:svg> </d:document>
この例では、ワープロ文書側の名前空間の別名を「d」に、SVG側の名前空間の別名をそれぞれ「s」に設定しています。要素名には接頭辞として別名をつけ、属性名には接頭辞をつけていないことが確認できるでしょうか。
方法はひとつではないということで、もうひとつの例を挙げておきます。
<?xml version="1.0" encoding="UTF-8"?> <d:document xmlns:d="http://www.test.com/xml/document/" xmlns:s="http://www.w3.org/2000/svg"> <d:p>これは段落です。以下に画像を挿入します。</d:p> <s:svg width="640px" height="400px" version="1.1"> <s:rect x="50" y="50" width="250" height="100" fill="blue" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" /> </s:svg> <d:p color="red">これは第 2段落です。以下に画像を挿入します。</d:p> <s:svg width="640px" height="400px" version="1.1"> <s:rect x="50" y="50" width="250" height="100" fill="blue" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" /> </s:svg> </d:document>
この例では、ルート要素(document要素)で 2つの名前空間の別名を宣言しています。
今回、名前空間を使用することにより、ワープロ文書側の要素と SVG側の要素を明確に区別することができ、上手く同居させることができました。このように、名前空間を使用すれば、複数の XML規格を上手く同居させることができるようになります。