接頭辞「xml」を使用したグローバル属性は、特別な意味があり、事前準備なしに使用することができます。接頭辞が「xml」であるグローバル属性、XMLとその関連規格にて、以下の4種類が定められています。
この節では、xml:lang属性と xml:space属性について解説し、xml:base属性と xml:id属性については省略します。
XML言語によってはいろいろな言語(日本語や英語など)を扱うかもしれません。そのために、言語を表すための属性が必要になることがあります。しかし、その属性が要素ごとやXML規格ごとにばらばらのネーミングでは混乱のもとです。例えば、以下のような感じだとどうでしょう。
<?xml version="1.0" encoding="UTF-8"?> <document lang="日本語"> <p>これは日本語です。</p> <p language="english">This part is written in English.</p> </document>
この例では、document要素の言語指定はlang属性で、p要素の言語指定はlanguage属性で指定します。属性名と属性値について、ひとつのXML文書で統一性がないと、あるいは複数のXML規格で統一性がないと、将来不自由することになるかもしれません。
「xml:lang」属性は、その要素が表す言語を指定するために XMLに用意された特別なグローバル属性です。これにより、どのXML文書でも統一的に言語の指定をすることができます。例えば、先の例は、次のように記述したほうが良いでしょう(アプリケーションがこのXML文書を読み込むのであれば、アプリケーションの改修も必要になります)。
<?xml version="1.0" encoding="UTF-8"?> <document xml:lang="ja"> <p>これは日本語です。</p> <p xml:lang="en">This part is written in English.</p> </document>
属性値は言語コードで記述します。言語コードは日本語の場合はja、英語の場合はenなどと記述します。言語コードは、ISO5646のルールに従って記述するようです。
なお、「xml:lang」属性は、通常、使用した要素のみならず、その子側の要素すべてに反映されます。
XML文書の要素の中のテキストに連続した空白やタブや改行が存在する場合、アプリケーションの多くはそれらを調整することでしょう。この動きについて、設定を行うのが「xml:space」属性です。
xml:space属性は、defaultとpreservのどちらかの値を取ることができます。デフォルト値はdefaultです。
defaultは空白やタブ、改行の扱いをXML文書を読み取るアプリケーションの判断に任せます。例えば、連続する空白はひとつの空白とみなされたり、テキストの前後の空白は取り除かれたりするかもしれません。
一方、preservを指定した場合、空白やタブや改行を保持することを明示します。
サンプルを以下に載せます。
<?xml version="1.0" encoding="UTF-8"?> <document> <text> ここは普通の段落なので、 アプリケーションによっては 空白やタブ、改行が取り除かれる場合があります。 </text> <text xml:space="preserv"> public class A { public static void main(String[] args) { System.out.println("Hello, world!"); } } </text> </document>
ひとつめのtext要素は、アプリケーションによっては、「ここは普通の段落なので、アプリケーションによっては、空白が取り除かれる場合があります。」と空白が無視されて処理が行われるかもしれません。しかし、ふたつめのtext要素では、xml:spase属性をpreservに設定して、改行や空白やタブなどをそのまま処理するように明示しています。アプリケーションが対応していれば、適切に取り扱われるでしょう。
HTML/XHTMLをご存じの方であればpre要素を思い浮かべると良いかもしれません。pre要素では、テキストの内容が空白やタブがそのまま表示されます。xml:space属性にpreservを設定した要素では、同様に、テキストの空白やタブ、改行などがそのまま保持されることを明示します。
なお、「xml:space」属性は、多くの場合、使用した要素のみならず、その子側の要素すべてに反映されます。