nsName 要素で明示します。anyName 要素と類似の働きをします。しかし anyName 要素が名前空間の内容に関わらず全ての名前を許可するのに対し、 nsName 要素では名前空間が特定されるという違いがあります。nsName 要素を子要素に持つ element, attribute 要素では、 name 属性は使えません。ns 属性で行います。スキーマ自体を接頭辞無しで用いている場合は、 xmlns 属性は使えません(ただし、スキーマ自体の要素や属性に接頭辞が附属されている場合を除く)。ns 属性が省略された場合は、先祖要素に記述された ns 属性の値が適用されます。anyName 要素と同様、 except 要素を用いた排他パターンのみが許されます。 except 要素と name 要素を使うことにより、特定の要素, 属性名を対象から除くことが出来ます。
名前空間 http://www.garden.co.jp/ に属する任意の属性を埋め込みたい場合、以下のような記述が考えられます。
<element name="喫茶店"> <zeroOrMore> <attribute> <nsName ns="http://www.garden.co.jp/"/> <text/> </attribute> </zeroOrMore> … </element>
以上のスキーマで、以下の XML 文書(の断片)は妥当なものとなります。
<喫茶店 庭:種類="ローズガーデン" 庭:広さ="10m^2"
xmlns:庭="http://www.garden.co.jp/">
…
</喫茶店>
尚、複数の種類の名前空間を許したい場合は、異る ns 属性値を有する nsName 要素を複数並べて書きます。以下に例を示します。
<element name="喫茶店"> <zeroOrMore> <attribute> <nsName ns="http://www.garden.co.jp/"/> <nsName ns="http://www.address.co.jp/"/> <text/> </attribute> </zeroOrMore> … </element>
except 要素を子要素に置いて、特定の名前を排除することを考えてみます。例1 のスキーマを、以下のように変えてみたとします。
<element name="喫茶店">
<zeroOrMore>
<attribute>
<nsName ns="http://www.garden.co.jp/">
<except>
<name>広さ</name>
</except>
</nsName>
<text/>
</attribute>
</zeroOrMore>
…
</element>
このようにした場合、以下の記述は妥当でなくなります。 庭:広さ 属性の記述が許されなくなっているためです。
<喫茶店 庭:種類="ローズガーデン" 庭:広さ="10m^2"
xmlns:庭="http://www.garden.co.jp/">
…
except 要素の中に nsName 要素を入れることで、特定の名前空間に属する名前を排除出来ます。例えば、名前空間 http://bad.com/ に属する要素のみを弾き、それ以外は全て許可したい場合は、以下のような記述が出来るでしょう。
<element name="例">
<zeroOrMore>
<element>
<anyName>
<except><nsName ns="http://bad.com/"/></except>
</anyName>
</element>
</zeroOrMore>
</element>