制約ファセットやるとかいっててウソばっかりです。
空要素の定義について書いておくの忘れてました。
<xsd:complexType/>
これだけです。
なぜ simpleType ではありません。complexType です。
属性を持つ場合は、
<xsd:complexType>
<xsd:attribute name="attr"type="xsd:string"/>
</xsd:complexType>
簡単ですね。
で、これ以外にも定義する方法があります。
空要素を定義するのではなく、空要素を許可するという定義があります。
前述の定義では、例えば br 要素や img 要素のように、絶対に中身を持たない要素を定義することになります。
内容があれば記述し、なければ空要素としたいということは往々にしてありますよね。
そんな場合は、このように記述します。
<xsd:element name="要素" type="要素型" nillable="true"/>
これだけではダメなのです。
XML インスタンスにその要素に対して、xsi:nil="true" 属性を追加しなければなりません。
<要素 xsi:nil="true"/>
こんな感じです。
xsi とは XML Schema において XML インスタンス用に定義された名前空間です。
名前空間 URI は http://www.w3.org/2001/XMLSchema-instance です。
nil と nillable です。null ではありません。
nil は l が 1 本、nillable は l が 2 本繋がるところも注意です。
Ruby、Delphi なんかをやったことがある方にはおなじみかもしれませんね。
んで、ぶっちゃけめんどくさくないですか?nillable だけでいーやんって私は思うのですが。
XML インスタンスがスキーマを知っている必要があるか?ということなんですね。
「XML インスタンスを作るアプリやシステムが」ではありません。「XML インスタンスそのものが」ということです。
出力するのはたかがひとつの属性です。
ですが、検証時には
- nillable で定義されているか?
- xsi:nil="true" 属性がついているか?
- xsi の名前空間は正しいか?
を検証しなければなりません。めんどーだと思うんだけどなぁ。