CDuceはW3CのXML名前空間の勧告を完全に実装している。アトム名(すなわちXML要素タグ)及びレコードのラベル(すなわちXML属性名)は、論理的には、名前空間URIとローカル部で構成されている。構文的には、修飾された名前でかかれ、勧告のQName生成と一致している。
QName ::= (Prefix ':')? LocalPart Prefix ::= NCName LocalPart ::= NCName
QNameの接頭辞は、名前空間URIに束縛されていなければならない。XMLにおいては、接頭辞から名前空間URIの束縛は、特別なxmlns:接頭辞の属性を用いて導入される。CDuceでは、その代わりに、明示的な名前空間束縛がある。例えば、XML文書、
<p:a q:c="3" xmlns:p="http://a.com" xmlns:q="http://b.com"/>は、CDuceで次のように書くことができる。
namespace p = "http://a.com" in namespace q = "http://b.com" in <p:a q:c="3">[]
この要素は、次のようにlet
束縛を用いて変数x
に束縛することができる。
let x = namespace p = "http://a.com" in namespace q = "http://b.com" in <p:a q:c="3">[]
この場合では、名前空間宣言はlet
のスコープローカルである。代わりに、グローバル接頭辞束縛を用いることができる。
namespace p = "http://a.com" namespace q = "http://b.com" let x = <p:a q:c="3">[]
同様に、CDuceは名前空間のデフォルト化をサポートしている。これはローカル及びグローバルのnamespace "..."
コンストラクションで導入される。XMLにおけるのと同様に、デフォルトの名前空間はタグ(アトム)にだけ適用され、属性(レコードのラベル)には適用されない。例えば、式namespace "A" in <x y="3">[]
においては、要素のタグに対する名前空間は"A"であるが、属性は名前空間を持たない。
トップレベル命令#env
により、CDuceは、現在のグローバル束縛の集合を、その他のものとともに、印字する。
グローバル名前空間宣言は、実は、現在のコンパイルユニットでエクスポートされる識別子を定義している。この識別子を他のユニットで用いて、同じ名前空間URIの接頭辞を再定義することができる。例えば、ユニットa
が次を含んでいれば、
namespace ns = "http://a.com"
別のユニットでは、次のように宣言することができる。
namespace ans = a.ns
open
文は名前空間宣言に対して作用する。open
されたユニットの全ての宣言は現在のユニットで際エクスポートされる。
(現在のコンパイルユニット又は別のユニットで)XMLスキーマがある識別子に束縛されると、この識別子を名前空間接頭辞の右側で使うことができる。例:
schema s = "..." namespace ns = s
型Atom
は、全ての名前空間における、全てのアトムを表現する。( <_>[]
のような)タグ位置におけるアンダースコアもこの型を表す。
それぞれのアトムは、Atom
の部分型を構成する。これらの単一型に加え、``名前空間の中であれば何でも''部分型があり、p
を名前空間接頭辞として、p:*
と書く。この型は、p
が意味する名前空間の中の全てのアトムを持つ。トークン.:*
は、現在のデフォルトの名前空間の中の全てのアトムを表現する。
print_xml
及びprint_xml_utf8
演算子は、XML文書の文字列表現を生成する。これの演算子は、接頭辞を名前空間に割り当てなければならない。現在の実装では、Cduceは、XML文書を、デフォルト名前空間なし、トップレベルの接頭辞束縛のみで生成する(つまり、xmlns:p="..."
属性がルート要素に対してしか生成されない)。接頭辞名は、いくつかの演算子のスコープで束縛されている接頭辞を用いようとする。ヒューリスティックを用いて選ばれる。最初に、print_xml
これができなければ、グローバル``ヒント''を用いる。(CDuceプログラムやロードしたXML文書で)接頭辞束縛に出会った時に毎回、名前空間に対するグローバルヒントを生成する。最後に、n
を整数としてnsn
の形式の新しい接頭辞を生成する。
print_xml (namespace "A" in <a>[])
接頭辞URI "A"に対する利用可能な名前がなければ、CDuceは新しい接頭辞を生成し、次のXML文書を生成する。
<ns1:a xmlns:ns1="A"/>
さて、次の式を考えてみる。
print_xml (namespace p = "A" in <p:a>[])
CDuceは次を生成する。
<p:a xmlns:p="A"/>
この場合、名前空間"A"に対する接頭辞束縛は、print_xml
のスコープにないが、名前p
がグローバルヒントとして利用可能である。最後に、次を考えてみる。
namespace q = "A" in print_xml (namespace p = "A" in <p:a>[])
ここで、接頭辞q
は、print_xml
のスコープで利用できる。したがって優先して用いられる。
<q:a xmlns:q="A"/>
最後の例として、次の式を考えてみる。
print_xml (namespace p ="A" in <p:a>[ (namespace p = "B" in <p:a>[]) ])
一つの名前p
が、両方の名前空間"A"及び"B"に対して利用可能である。CDuceは、これを"A"に割り当てることを選び、"B"に対する新しい名前を生成するため、次を生成する。
<p:a xmlns:ns1="B" xmlns:p="A"><ns1:a/></p:a>
新しい名前はprint_xml
の適用に対して``ローカル''であることに注意すること。print_xml
を複数回適用すると、同じ名前ns1
、ns2
、…を再利用することになる。
CDuceのインタプリタ及びトップレベルは、前の項で述べたのと似たアルゴリズムを用いて、名前空間を呼び出すCDuceの値及び型を清書する。
主要な相違は、現在の接頭辞束縛の集合をデフォルトで使わないことである。その論拠は、この集合が変化しうるので、CDuceの出力を理解するのが難しくなるからである。接頭辞が一度確保されると、別の名前空間に再利用されることはない。トップレベル命令#env
を使うと、CDuceは清書に使われる接頭辞の表を、その他とともに、印字する。命令#reinit_ns
を用いてこの表を再初期化することができる。この命令は、将来清書するための接頭辞を割り当てるヒントの一次ソースとして接頭辞束縛を使うかどうかを設定することもできる。
CDuceは、名前空間接頭辞が単に(CDuce又はXMLの)パーサもうpって解決されるマクロとして扱われる処理モデルを推奨している。しかしながら、XML仕様書の中には、各要素に対して、接頭辞から名前空間へのローカル束縛の集合を、見えるままにしておくように、アプリケーションに要求するものがある。CDuceはそれに対するサポートを提供する。
型システムに反映されていなくても、CDuceでは、XML要素に名前束縛の表をオプションで付け加えることができる。次のビルトイン関数により、プログラマはこの情報に明示的にアクセスすることができる。
type Namespaces = [ (String,String)* ] namespaces: AnyXml -> Namespaces set_namespaces: Namespaces -> AnyXml -> AnyXml
namespaces
関数は、引数に名前空間情報が関連付けられていなければ、例外を発生させる。
XML要素が生成されると、CDuceコードの中のリテラルで、又load_xml
でCDuceにスコープ中の名前空間束縛を覚えるように指示することができる。これは、次のコンストラクションで行うことができる。
namespace on in e
e
の中で作られたXML要素は、(load_xml
を呼び出すことによるものも含め)注釈を付けられる。同様に、部分式においてこの仕組みを切るnamespace off
コンストラクションがある。又、両方のコンストラクションとも、トップレベルで使うことができる。
# namespace cduce = "CDUCE";; # namespaces <cduce:a>[];; Uncaught CDuce exception: [ `Invalid_argument 'namespaces' ] # namespace on;; # namespaces <cduce:a>[];; - : Namespaces = [ [ "xsd" 'http://www.w3.org/2001/XMLSchema' ] [ "xsi" 'http://www.w3.org/2001/XMLSchema-instance' ] [ "cduce" 'CDUCE' ] ] # namespaces (load_xml "string:<a xmlns='xxx'/>");; - : Namespaces = [ [ "" 'xxx' ] ]
接頭辞xml
へのデフォルトの束縛は、名前空間の結果には決して現れない。
xtransform
イテレータは、単に横切ったXML要素に対して付加された名前空間の情報を変更することはしない。汎用の比較演算子では、関連付けられた名前空間の情報によるだけの違いしかない二つのXML要素を区別することはできない。
XML 1.1におけるW3C名前空間勧告候補とは逆で、CDuceの宣言namespace p = ""
は接頭辞p
の宣言を取り消すことはしない。代わりに、空の名前空間に束縛する(つまり、この接頭辞を用いたQNameは名前空間を持っていないとして解釈される)