xml接頭辞の付いたグローバル属性

2003年4月20日(日)更新


■xml接頭辞の付いたグローバル属性

たけち: 前回までグローバル属性についてしっかり学んだけれど、今回と次回は、グローバル属性を使った規格の中でも、今まで学んだことから少し外れる特殊なグローバル属性を勉強することにするね。具体的に言うと、xml接頭辞の付いたグローバル属性についてだよ。

さらら: xml接頭辞の付いたグローバル属性?

たけち: そう、XMLの規格にはいくつか要素や属性や名前空間接頭辞の名前などに使ってはいけない、特殊な予約された言葉があるんだけれど、その中の一つに、xmlという言葉があるんだ。このxmlという言葉を名前空間接頭辞に使う規格を作っても良いのは、W3Cだけなんだ。

さらら: 特別扱いの接頭辞なのね。

たけち: そう。で、このxmlという名前空間接頭辞が普通の接頭辞と違って、次のような特徴があるんだよ。

  • 名前空間宣言なしに使用可能
  • どんなXMLデータにも(暗黙のうちに)あたかもxmlという接頭辞の名前空間宣言が存在するかのような状態がある

さらら: あっ、そうなの。でも、名前空間宣言なしに使用可能って不思議だわ。

たけち

■xmlという接頭辞の名前空間

たけち: うん。普通、名前空間接頭辞は名前空間宣言を使って宣言しないと駄目だよね。でも、xmlという接頭辞とxmlnsという接頭辞の2つだけは、その例外で宣言しなくてもいいというふうになっているんだ。そして、xmlという接頭辞は、http://www.w3.org/XML/1998/namespace という名前空間と結びついていることが決められているんだね。つまり、次のように書かれているのと同じ状態だってことだね。
      xmlns:xml=http://www.w3.org/XML/1998/namespace

さらら: へぇ〜。xmlnsはこれまで出てきたけど、xmlにはどんなものがあるのかしら。


■xml:lang

たけち: 実際にxmlという接頭辞が付く名前空間のグローバル属性の、xml:lang, xml:space, xml:baseの3つは基本的で汎用性の高い重要なグローバル属性なのでここで学んでおこうね。

さらら: あっ、3つだけ知ってればいいのね。よかった・・・(^ ^;

たけち: まず、xml:langなんだけれど、これは、このグローバル属性が使われている要素や、その子孫となる要素で、内容となるテキストがどのような自然言語が使われているかを示す部分なんだ。子孫となる要素では、その中で再びこのxml:langが出てきて再定義しない限り有効なんだよ。HTMLにlangという属性があるんだけれど、それを汎用のグローバル属性にしたようなものだね。

さらら: どういう言語が使われているかを示すグローバル属性なのね。でも、それって重要なのかしら。

たけち: 例えば、テキストの内容が日本語だとわかっていれば、禁則処理等の日本語特有の処理が表示する際にできたりするよね。

さらら: あ、そういう使い方ができるわね。

たけち: 実際の使い方を見てみようね。例えば次のようなXMLデータだよ。

さらら

XMLデータ例: 万葉歌 xml:lang属性つき
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem mp:pno="4088" xmlns:mp="http://www.yuragi.jp/ns/manyouPoem" xml:lang="ja">
<mp:poet>大伴家持</mp:poet>
<mp:kana>左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
<mp:yomi>さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</mp:yomi>
<mp:yaku>百合の花。また後にもお会いしたいと思うからこそ、今この時も、誠実に親しくするのですよ</mp:yaku>
<mp:yaku xml:lang="en">I receive you warmingly with lovely lily, 'cause I hope we'll meet again</mp:yaku>
</mp:poem>

たけち: ここでは、mp:poem要素にxml:lang="ja"という指定がしてあるよね。そこで、その子要素となる、xml:lang属性のないmp:yomi要素やmp:kana要素、mp:poet要素は日本語であることが示されるんだ。しかし、その子孫でも <mp:yomi xml:lang="en"> と書かれた要素の内容は、英語だということが示されるわけなんだね。

さらら: なるほど。


■xml:space

たけち: さて、次にxml:spaceについて説明しようね。これはdefaultpreserveかのどちらかの値をとるグローバル属性なんだ。まずは次の例を見てみようね。(以降、△は半角スペースを意味しているものとします。)

XMLデータ例: 万葉歌
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem mp:pno="4088" xmlns:mp="http://www.yuragi.jp/ns/manyouPoem">
△△<mp:poet>大伴家持</mp:poet>
△△<mp:kana>左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
△△<mp:yomi>さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</mp:yomi>
</mp:poem>

たけち: mp:poemの子要素となるmp:poet, mp:kana, mp:yomi要素は、行頭からいわゆる半角スペースが2つ入っているよね。これって、どうして半角スペースが入っていると思う?

さらら: それは、やっぱり要素の親子関係がはっきりわかりやすいからでしょ。こういうふうに半角スペースを入れたほうが、XMLデータが見やすくていいわ。

たけち: そうだよね。じゃ、次のXMLデータを見てみようね。

さらら

XMLデータ例: 小説
<?xml version="1.0" encoding="Shift_JIS" ?>
<p>
僕はさっそく駅へ向かった。
そして<em>奈良へ行く<strong>汽車</strong>の切符</em>を買った。
<font color="#ff0033">切符</font>を握りしめて、
<strong>汽車</strong>に揺られながら、
僕はいつのまにか
△△△△<font color="#0000ff">深い眠り</font>についていた。
</p>

たけち:  この場合、

△△△△<font color="#0000ff">深い眠り</font>についていた。

 の行頭に半角スペースが4個入ったり、改行されたりしているんだけれど、これは要素の親子関係をはっきりさせるために入っているのかな?

さらら: そうじゃないと思うわ。これって、やっぱり表示されたときに、

僕はさっそく駅へ向かった。
そして奈良へ行く汽車の切符を買った。
切符を握りしめて、
汽車に揺られながら、
僕はいつのまにか
△△△△深い眠りについていた。

 こんな感じの表示効果を狙って改行や半角スペースを入れているんだと思うわ。

たけち: 多分そうだね。でも、こういう混在内容の場合、特にWell-formedで扱いたい場合、その空白文字が、XMLデータ上の見易さを勘案して入っているものなのか、本当に空白文字のデータとして保持して処理されて欲しいものなのか、ということがわからないよね。そこで、つぎのように、xml:space="preserv"と書いておくと、明示的に半角スペースを保持して欲しいという意図が伝わるんだ。

さらら

XMLデータ例: 小説 xml:space="preserv"付き
<?xml version="1.0" encoding="Shift_JIS" ?>
<p xml:space="preserv">
僕はさっそく駅へ向かった。
そして<em>奈良へ行く<strong>汽車</strong>の切符</em>を買った。
<font color="#ff0033">切符</font>を握りしめて、
<strong>汽車</strong>に揺られながら、
僕はいつのまにか
△△△△<font color="#0000ff">深い眠り</font>についていた。
</p>

たけち: 逆にxml:space="default"とすれば、これはこういう空白文字をアプリケーション側の判断に任せます、という意味になるわけだね。

さらら: なるほど、こういう使い方ができるわけね。


■xml:base

たけち: さて、最後にxml:base属性について説明するね。これはHTMLのbase要素を、汎用的なグローバル属性にしたようなものなんだ。XMLデータを見て。

XMLデータ例: 万葉歌 xml:base付き
<?xml version="1.0" encoding="Shift_JIS" ?>
<mp:poem mp:pno="4088" xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"
           xml:base="http://www.example.com/xml/"
           xmlns:xlink="http://www.w3.org/1999/xlink">
<mp:poet xlink:type="simple" xlink:href="yakamochi.xml">大伴家持</mp:poet>
<mp:kana>左由理婆奈 由里毛安波牟等 於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
<mp:yomi>さ百合花、ゆりも逢はむと、思へこそ、今のまさかも、うるはしみすれ</mp:yomi>
</mp:poem>

たけち: このXMLデータはXLinkを使っていて、大伴家持のという作者の名前がyakamochi.xmlへとリンクされているんだ。もしxml:base属性がなければ、このXMLデータが置いてあるのと同じディレクトリのyakamochi.xmlへとリンクされるわけだけれど、xml:base="http://www.example.com/xml/"という属性があるために、結局、
     http://www.example.com/xml/yakamochi.xml
 というURIへとリンクされることになるわけだね。こういうふうにxml:base属性を使って、リンク先を柔軟に変更させることなどが可能なんだね。

さらら: あ、これも便利そうね。

たけち: これでxml接頭辞の付いたグローバル属性は3つとも、とても大事なことばかりを扱うグローバル属性だということがわかってもらえたかな。

さらら: えぇ、よくわかったわ(^ ^)

たけち: よかった。(^ ^; 今回はこれでおしまいにするね。

さらら: うん。ありがと。

次回はxml接頭辞の付いたグローバル属性-2です。...... (^ ^;

さらら

XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。