昨日の XML Schema のデータ型に Name と NCName と QName という似たようなデータ型があります。
これはいったいなんでしょう?
まず、QName とは属性名や要素名の形式です。
xsl:stylesheet のように名前空間接頭辞:localName の形式です。
これに対して展開された名前というものが存在します。
これは "http://www.w3.org/1999/XSL/Transform"+"stylesheet" のように名前空間を URI に展開します。
つまり、同じ名前空間に属する同じ localName の要素でも QName は違う可能性がありますが、展開された名前は必ず一致します。
この、名前空間接頭辞:localName の形式を QName といいます。
データ型としてわかりやすいのは、xsd:element 要素の name 属性とかでしょうか。
たいして、Name と NCName は要素内容や属性値に使用できる文字の集合を表しています。
要素名や属性名に使用できる文字で構成された文字列データということです。
そのため、xsd:string から派生したものになっています。
NCName とは Name で使用される文字から : を取り除いたものです。
XML において名前に : は含むことができます。
ただし、名前空間とのデリミタとしても使用されるため、推奨されていません。(パーサーによってはエラーにもなりますね)
要するにまぎらわしいんですよ。
ID データ型は NCName から派生しています。
つまり、ID データ型に指定された属性値には : を含むことができないのです。
そういえば、ASP.NET で id 属性にレンダリングされる Control.ClientID は Control.UniqueID の : を _ に置換したものですね。
(ASP.NET 2.0 以降なら $ か。まあ $ は ID 型や NCName 型以前に Name 型として不適なので同じですけど)
それもちゃんと理由があるわけですね。
ま、これは XML Schema の ID 型というか DTD の ID 型なんですけれども。
XML Schema の ID 型も DTD の ID 型に対応させるためにあるわけなので、結局は同じ話です。