要素によって属性は異なります。言い換えれば、属性は要素固有のものでした。一方で、XMLでは特定の要素固有ではない、汎用的な属性を設定することができます。これをグローバル属性といいます。グローバル属性は、属性に接頭辞をつけて表現します。
この節では、先の章でサンプルとした、SVGを含んだワープロ文書を例にして解説します。以下に再掲します(名前空間を使用したものと、デフォルト名前空間を使用したものの 2例を挙げます)。
デフォルト名前空間を使用しないもの。
<?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>
デフォルト名前空間を使用したもの。
<?xml version="1.0" encoding="UTF-8"?> <document xmlns="http://www.test.com/xml/document/"> <p>これは段落です。以下に画像を挿入します。</p> <svg xmlns="http://www.w3.org/2000/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 xmlns="http://www.w3.org/2000/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文書で保存できるようにしたいとします。それを属性によって実現することとします。このとき、要素の種類に関わらず、統一的な属性名を適用する必要があります。グローバル属性を用いること、このような要求に応えることができます。
具体的な例として 4例を挙げます。多くの例を見ることによって、グローバル属性の使い方について見慣れればと思い、4例を上げることとしました。
なお、4例とも、コメントの要素名を「comment」と決めて作成しています。
コメントのための専用の名前空間を用意した場合、XML文書の構造は、例えば、以下のような構造になるかもしれません。なお、コメントのための専用の名前空間は「http://www.test.com/xml/document/comment/」とします。
デフォルト名前空間を使用しないサンプルの場合。
<?xml version="1.0" encoding="UTF-8"?> <d:document c:comment="コメント1" xmlns:d="http://www.test.com/xml/document/" xmlns:c="http://www.test.com/xml/document/comment/" xmlns:s="http://www.w3.org/2000/svg"> <d:p c:comment="コメント2">これは段落です。以下に画像を挿入します。</d:p> <s:svg width="640px" height="400px" version="1.1" c:comment="コメント3"> <s:rect x="50" y="50" width="250" height="100" fill="blue" c:comment="コメント4" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" c:comment="コメント5" /> </s:svg> <d:p color="red" c:comment="コメント6">これは第 2段落です。以下に画像を挿入します。</d:p> <s:svg width="640px" height="400px" version="1.1" c:comment="コメント7"> <s:rect x="50" y="50" width="250" height="100" fill="blue" c:comment="コメント8" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" c:comment="コメント9" /> </s:svg> </d:document>
続いて、デフォルト名前空間を使用したサンプルの場合です。
デフォルト名前空間を使用したサンプルの場合。
<?xml version="1.0" encoding="UTF-8"?> <document c:comment="コメント1" xmlns="http://www.test.com/xml/document/" xmlns:c="http://www.test.com/xml/document/comment/"> <p c:comment="コメント2">これは段落です。以下に画像を挿入します。</p> <svg xmlns="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1" c:comment="コメント3"> <rect x="50" y="50" width="250" height="100" fill="blue" c:comment="コメント4" /> <circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" c:comment="コメント5" /> </svg> <p color="red" c:comment="コメント6">これは第 2段落です。以下に画像を挿入します。</p> <svg xmlns="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1" c:comment="コメント7"> <rect x="50" y="50" width="250" height="100" fill="blue" c:comment="コメント8" /> <circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" c:comment="コメント9" /> </svg> </document>
コメントのための専用の名前空間を用意せず、ワープロ文書側の規格を拡張して対応しよう、という場合、XML文書の構造は、例えば、以下のようになるかもしれません。
デフォルト名前空間を使用しないサンプルの場合。
<?xml version="1.0" encoding="UTF-8"?> <d:document d:comment="コメント1" xmlns:d="http://www.test.com/xml/document/" xmlns:s="http://www.w3.org/2000/svg"> <d:p d:comment="コメント2">これは段落です。以下に画像を挿入します。</d:p> <s:svg width="640px" height="400px" version="1.1" d:comment="コメント3"> <s:rect x="50" y="50" width="250" height="100" fill="blue" d:comment="コメント4" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" d:comment="コメント5" /> </s:svg> <d:p color="red" d:comment="コメント6">これは第 2段落です。以下に画像を挿入します。</d:p> <s:svg width="640px" height="400px" version="1.1" d:comment="コメント7"> <s:rect x="50" y="50" width="250" height="100" fill="blue" d:comment="コメント8" /> <s:circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" d:comment="コメント9" /> </s:svg> </d:document>
2つめの p要素に注目してください。color属性には接頭辞がついていないので要素固有の属性として扱われ、一方で comment属性には接頭辞がついているのでグローバル属性として扱われます。
続いて、デフォルト名前空間を使用したサンプルの場合です。
デフォルト名前空間を使用したサンプルの場合。
<?xml version="1.0" encoding="UTF-8"?> <document d:comment="コメント1" xmlns="http://www.test.com/xml/document/" xmlns:d="http://www.test.com/xml/document/"> <p d:comment="コメント2">これは段落です。以下に画像を挿入します。</p> <svg xmlns="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1" d:comment="コメント3"> <rect x="50" y="50" width="250" height="100" fill="blue" d:comment="コメント4" /> <circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" d:comment="コメント5" /> </svg> <p color="red" d:comment="コメント6">これは第 2段落です。以下に画像を挿入します。</p> <svg xmlns="http://www.w3.org/2000/svg" width="640px" height="400px" version="1.1" d:comment="コメント7"> <rect x="50" y="50" width="250" height="100" fill="blue" d:comment="コメント8" /> <circle cx="200" cy="200" r="100" stroke-width="10" fill="red" stroke="green" d:comment="コメント9" /> </svg> </document>
グローバル属性には接頭辞をつけなければなりません。言い換えれば、グローバル属性はデフォルト名前空間の恩恵を受けられないということもあります。このため、この例では、デフォルト名前空間を使用しながら、同じ名前空間を別名で定義しています。XML文書としての文法を満たしていますが、あまり綺麗な例ではないと思います。