名前空間を持つ要素の内側に子要素を定義する - XML スキーマ - XML プログラミング

PROGRAM


名前空間を持つ要素の内側に子要素を定義する

XML スキーマでは <xsd:element> タグを適切に入れ子にすることで、要素内の別の子要素を定義することができます。

ただ、名前空間つきで定義している XML スキーマの場合、子要素を定義しようとしたときに、name 属性で指定した要素名が名前空間に属さない要素として扱われてしまい、検証時にエラーとなってしまいます。

これを回避するためには、ref 属性を使って、別で定義した要素を子要素として名前空間つきで指定する方法と、<xsd:schema> 要素の elementFormDefault 属性で "qualified" を指定する方法の 2 つがありました。

 

まず、ref 属性を使って別々に定義する方法です。

接頭辞 xsd を名前空間 "http://www.w3.org/2001/XMLSchema" としたときに、テキストだけの要素なら、次のように定義できます。

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema

targetNamespace="http://xxx.xxx.xx/schema1"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:acm="http://xxx.xxx.xx/schema1"

>

<xsd:complexType name="ファイル">

<xsd:sequence>

<xsd:element ref="acm:名称" />

<xsd:element ref="acm:内容" />

</xsd:sequence>

</xsd:complexType>

 

<xsd:element name="名称" type="xsd:string" />

<xsd:element name="内容" type="xsd:string" />

 

<xsd:schema>

このように子要素 "名称" と "内容" を個別に定義して、それを ref 属性を使って、名前空間つきの要素名で指定してあげる感じです。

 

子要素を入れ子で定義したい場合には、<xsd:schema> 要素に elementFromDefault 属性を設定します。

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema

targetNamespace="http://xxx.xxx.xx/schema1"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:acm="http://xxx.xxx.xx/schema1"

elementFormDefault="qualified"

attributeFormDefault="qualified"

>

<xsd:complexType name="ファイル">

<xsd:sequence>

<xsd:element name="名称" type="xsd:string" />

<xsd:element name="内容" type="xsd:string" />

</xsd:sequence>

</xsd:complexType>

 

<xsd:schema>

このように、名前空間に属する要素の定義でも、入れ子として要素の実体を定義することができます。


[ もどる ]