XMLスキーマ

概要

CDuceはXMLスキーマ勧告(入門、構造、データ型)を部分的にサポートしている。CDuceの機能を用いて、リーフが整数、日付、バイナリデータなどのような型付けされた値であるXML文書を扱うことができる。

CDuceのXMLスキーマサポートでは、次の機能が実装されている。

このマニュアルページでは、CDuceでこれらの機能を使う方法を説明し、例で使われている文書の全ては、マニュアルのXMLスキーマのサンプル文書の項で利用可能である。

注意: XMLスキーマのサポートは、現在のところ分割コンパイルと相性が良くない。XMLスキーマを使うCDuceのユニットscript.cdがコンパイルされると、結果となるscript.cdoのオブジェクトはXMLスキーマを名前で参照する。つまり、ユニットが実行されると、XMLスキーマはまだ同じディレクトリで利用できなければならず、かつコンパイルされてから変更がなされてはならない。

XMLスキーマコンポーネントの(非常に簡単な)紹介

XMLスキーマ文書は、4種類の異なるコンポーネントを定義することができ、そのそれぞれをCDuceにインポートし、CDuceの型として使うことができる。

型宣言
型宣言は、単純型又は複合型のいずれかを定義する。前者は、要素の文字列内容をより厳密に型付けするのに用いることができる。#PCDATAの改良版と考えると良い。XMLスキーマは定義済み単純型と、新しい単純型を定義する手段を提供する。後者は、XML要素の内容モデル及び属性を制約するのに使うことができる。XMLスキーマの複合型は、DTDの要素定義より厳密に表現力が高い。
要素宣言
要素宣言は、混合型と属性名を繋げたものである。又、型が単純型であれば、固定値やデフォルト値を命じることで、要素に対する可能な値の集合を制約する。
属性グループ宣言
他のXMLスキーマコンポーネントから参照された名前と属性宣言を繋げたものである。
モデルグループ宣言
モデルグループ宣言は、複合のXML要素の内容に対する制約と名前をつなげたものである。

属性宣言は、現在のところCDuceの型を生成せず、それ自体を評価に用いることはできない。

XMLスキーマコンポーネントのインポート

XMLスキーマコンポーネントをCDuceにインポートするためには、まず最初にCDuceにXMLスキーマ文書をインポートするように指示する必要がある。スキーマキーワードを用いて、大文字で始まる識別子をローカルのスキーマ文書に束縛することで、これを行うことができる。

# schema Mails = "tests/schema/mails.xsd";;
Registering schema type: attachmentType
Registering schema type: mimeTopLevelType
Registering schema type: mailsType
Registering schema type: mailType
Registering schema type: bodyType
Registering schema type: envelopeType
Registering schema element: header
Registering schema element: Date
Registering schema element: mails
Registering schema attribute group: mimeTypeAttributes
Registering schema model group: attachmentContent

上の宣言は、スキーマ文書mails.xsdの中に含まれる全てのスキーマコンポーネントをCDuceの型としてインポートする(しようとする)。ドット演算子を用いて参照することができる。例えば、S.mails

XMLスキーマでは、コンポーネント名に曖昧さを許している。CDuceでは、要素、型、モデルグループ、属性グループの順序でスキーマコンポーネントを解決することを選択した。

スキーマコンポーネントの参照の結果は、通常のCDuceの型となり、関数定義、パターンマッチなどで通常通りに使うことができる。

let is_valid_mail (Any -> Bool)
  | Mails.mailType -> `true
  | _ -> `false

正当性に関する備考: XMLスキーマ文書をパースする際、CDuceは、文書がXMLスキーマ勧告に対して正当であると仮定する。少なくとも、スキーマに対するXMLスキーマに対して妥当であることが要求される。CDuceにインポートする前に正当性を検査することを推奨する。そうしないと、奇妙な振る舞いが予想される。

トップレベル命令

トップレベル命令#envはスキーマをサポートしており、現在定義されているスキーマを列挙する。

トップレベル命令#print_typeもスキーマをサポートしており、スキーマコンポーネントに対応する型を印字するのに使うことができる。

# #print_type Mails.bodyType;;
[ Char* ]

詳しくは、マニュアルのトップレベル命令の項を見ること。

XMLスキーマ→CDuceのマップ

XMLスキーマの検証

XMLスキーマの検証及び査定の処理は、XMLスキーマインスタンス文書がXMLスキーマ文書に対して妥当であることを検査し、デフォルト値にような欠落している情報を付加することである。CDuceの概念でのスキーマ検証は、ちょっと変わっている。

CDuceはXMLの値が任意の型でできていることを許していて、例えば、整数の属性を持つXML要素を持つことができる。この機能は、XML文書をロードするのに使われる関数(load_xml)が、PCDATA型の値をリーフとして持つXMLの値を返すので、滅多に使われることはない。

一度CDuceでXMLスキーマをインポートすると、これを使い、load_xmlで返るXMLの値を、定義されたXMLスキーマコンポーネントに対して検査することができる。検証の処理は、基本的には、検証時にCDuceの型に対して使われるコンポーネントの、XMLスキーマの型規約に対応する型を持っているCDuceの値を組み立てることである。規約は、前の項目で説明したのと同じである。入力のXMLの値がload_xmlによる必要はなく、PCADATA値をリーフとして持っていれば十分であることに注意。

検証の際、PCDATA文字列はパースされ、XMLスキーマの単純型に対応するCDuceの値を組み立て、空白はXMLスキーマのwhiteSpaceファセットによって明示されるとおりに扱われる。例えば、1234567890というPCDATA文字列をxsd:integer単純型に対して検査すると、型Intで型付けされたCDuce値を返す。

欠落している属性又は要素のデフォルト値も、明示された場所に追加される。

CDuceのプログラムにおいて検査を実行するために、validateキーワードを使うことができる。構文は次のようになる。validate <expr> with <schema_ref>ただし、schema_refXMLスキーマコンポーネントのインポートで説明したように定義してあるとする。同じ曖昧規則がここでも適用される。

さらに詳しく言うと、検証は、検証に対して使われるスキーマコンポーネントの型によって、異なる種類のCDuceの値に適用することができる。

XMLスキーマインスタンスの出力

通常のprint_xml及びprint_xml_utf8ビルトイン関数を用いて、XMLスキーマ検証の結果として得られた値を印字することが可能である。

サポートされていないXMLスキーマの機能

CDuceに組み込まれたXMLスキーマに対するサポートは、XMLスキーマの仕様書を完全にカバーしようとはしていない。特に、インポートされたスキーマは、妥当であると検査されない。スキーマの妥当性を検査するには、例えば、オンラインの検査器を使うことができる。

また、XMLスキーマ仕様書の機能の中には、サポートされていなかったり、部分的にしかサポートされていなかったりするものがある。ここに非網羅的な制限のリストを示す。