グローバル属性とグローバル属性宣言 その3

2003年3月23日(日)更新


■属性についての復習

たけち: 前回までの話がどんなだったか、ここでおさらいしておこうね。

  1. DTDでは属性は、どの要素の属性かという形で宣言されていた。またXML Schemaでも今までデータ型の中で属性宣言するどのデータ型の属性かという書き方を学んできた。
  2. 同じ名前の属性であっても、所属する要素が異なれば、まったく異なるデータ型をとってもかまわない。
  3. 所属する要素に関係なく、一定の目的を持って一定のデータ型をとる属性のあり方も考えられる。これは異なる要素で使われるだけでなく、場合によっては異なる名前空間のスキーマで使われることもあると考えられる。
  4. そこでXML Schemaでは、データ型定義の中で属性宣言をするのではなく、要素のように、直接、対象名前空間に所属する属性の宣言をするグローバル属性宣言という書き方も許されている。そして名前空間接頭辞を持った属性はグローバル属性と呼ばれる。

■表記的なグローバル属性と機能的なグローバル属性

さらら: そうよね。そして私が、
グローバル属性は直接的に名前空間に所属するものとして宣言され、名前空間の異なるスキーマの違いも越えて、グローバルにいろいろな要素の中で使われるのね」
 という話をしたら、たけちが『実はちょっと違うんだ』って言ったのよね。

たけち: そうだね。確かに混乱させるような話で申し訳ないんだけれど... 実は表記的な意味でのグローバル属性と、機能的な意味でのグローバル属性(宣言)があるんだ。

さらら: 表記的? 機能的?

たけち: うん。まずは、表記的な意味でのグローバル属性について説明することにするね。

さらら

■表記的な意味でのグローバル属性

たけち: 前回見てもらった例題にprint:colorという名前の名前空間接頭辞付きの属性が出てきたよね。

XMLデータ例: 万葉歌【manyouPoem.xml】
<mp:poem pno="4088"
     xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:print="http://www.yuragi.jp/ns/print">

  <mp:poet print:color="black">大伴家持</mp:poet>
  <mp:kana print:color="red">左由理婆奈 由里毛安波牟等
     於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
  <mp:yomi print:color="blue">さ百合花、ゆりも逢はむと、
    思へこそ、今のまさかも、うるはしみすれ</mp:yomi>

</mp:poem>

さらら: 今まで見たことのない形だから、びっくりしちゃった。でもよく考えれば、名前空間宣言でもxmlns:mpと書くから、似たようなものは今まで見てきていたのね。

たけち: そうだね。まあxmlns:mpのような名前空間宣言は、属性のような形をしているけれども、本当の属性とは異なる、かなり特殊な扱いの属性だね。
print:colorのような名前空間接頭辞付きの属性は、今まで見てきたような名前空間接頭辞が付かない属性とは、また別の種類として扱われるんだ。

さらら: えっ、名前空間接頭辞が付くか付かないかで、別の種類の属性として扱われるの?

たけち: そうなんだ。例えば次の例を考えてみようね。

さらら

XMLデータ例: 同じ名前の属性が2ヶ所に出現
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:example samename="これは駄目"
                samename="これは駄目だね"
                xmlns:ex="http://www.example.com/">
  これは駄目じゃん<ex:example>

たけち: 一つの要素の中に、samenameという名前の属性が2ヶ所に出現しているよね。こういう書き方はエラーになるんだよ。属性が出現するときは、同じ名前のものが2つ以上、同じ要素の中に出てくることはないんだ。

さらら: そうね。それはわかるわ。

たけち: 次のような書き方も駄目だよ。

たけち

XMLデータ例: 同じ名前の属性が2ヶ所に出現(名前空間接頭辞付き)(
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:example ex:samename="これは駄目"
                ex:samename="これは駄目だね"
                xmlns:ex="http://www.example.com/">
  これは駄目じゃん<ex:example>

たけち: やはり同じ名前の属性が2ヶ所に出現しているから、これもエラーになるんだよ。

さらら: えぇ。

たけち: でもね。次のようなXMLデータは良いんだよ。

XMLデータ例: 名前空間接頭辞無しと名前空間接頭辞付き(
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:example ex:samename="これは良い"
                samename="良いんだよ"
                xmlns:ex="http://www.example.com/">
  良いよね<ex:example>

たけち: 名前空間接頭辞が付くか付かないかで別の種類の属性として扱われるから、ex:samenamesamenameは別の種類の属性ということになって、まったく問題がないんだ。

さらら: そうなの〜。

たけち: 例えば次のような書き方もエラーにならないんだ。

XMLデータ例: 名前空間が異なる属性(
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:example ex1:samename="これは良い"
                ex2:samename="良いんだよ"
                xmlns:ex1="http://www.example1.com/"
                xmlns:ex2="http://www.example2.com/">
  良いよね<ex:example>

たけち: ex1:samename属性とex2:samename属性は、名前空間が違っているので、まったく別の属性として扱われるんだね。でも、次の例のように名前空間が同じだとだめだよ。

XMLデータ例: 名前空間が同一の属性
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:example ex1:samename="これは駄目"
                ex2:samename="駄目だね"
                xmlns:ex1="http://www.example.com/"
                xmlns:ex2="http://www.example.com/">
  駄目じゃん<ex:example>

さらら: えっ、どうして??

たけち: ex1:samename属性とex2:samename属性は一見別の属性のように見えるけれど、実はどちらの接頭辞が示しているのもhttp://www.example.com/で変わらないからなんだよ。

さらら: あっ。う〜ん。

たけち: ここで、ちょっと間違いやすい問題を出してみようかな(^ ^;) 次の書き方はエラーになるかな? それともOKかな?

XMLデータ例: 正しい?間違い?
<?xml version="1.0" encoding="Shift_JIS" ?>
<ex:example ex:samename="これは良いのかな"
                samename="良いかな"
                xmlns:ex="http://www.example.com/"
                xmlns="http://www.example.com/">
  本当に良いの?<ex:example>

さらら: え〜、どっちかしら。xmlns="http://www.example.com/"とデフォルト名前空間が使ってあるということは、接頭辞のつかないsamename属性はex:samename属性と同じようにも見えるけど・・・・・

たけち: じゃあ、答えは次回にね。

さらら: あ〜ん。いじわる!!

グローバル属性とグローバル属性宣言 その4に続きます...... (^ ^;

さらら

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