XML Schemaの要素を記述するときの注意事項について説明します。また,非サポート要素の代替記述についても説明します。
list要素を記述する場合の注意事項を示します。
<simpleType name="IntList">
<list itemType="xsd:int"/>
</simpleType>
<simpleType name="IntListList">
<list itemType="intf:IntList"/>
</simpleType>
記述できない要素および属性を記述した場合,不正なソースが生成されます。
simpleContent要素は非サポート要素です。単純型を拡張した複合型を定義するには,complexType要素を使用して記述してください。
単純型を基準型として拡張して,複合型を定義する場合の修正例を示します。
<修正前(非サポート)>
<xsd:element name="elm1">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="att1" type="xsd:int" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<elm1 att1="123">abc</elm1>
<修正後(代替記述)>
<xsd:element name="elm1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="data" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="att1" type="xsd:int"/>
</xsd:complexType>
</xsd:element>
<elm1 att1="123">
<data>abc</data>
</elm1>
simpleContent要素は非サポートです。complexType要素を使用して,別の型として定義してください。
単純型を使用した派生によって,制限された複合型を定義する場合の修正例を示します。
<修正前(非サポート)>
<xsd:complexType name="attDataBase" >
<xsd:simpleContent >
<xsd:extension base="xsd:int" >
<xsd:attribute name="currency"
type="xsd:string" />
<xsd:attribute name="country"
type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType >
<xsd:element name="elm1">
<xsd:complexType>
<xsd:simpleContent>
<xsd:restriction base="intf:attDataBase" >
<xsd:attribute name="currency"
type="xsd:string" />
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType >
</xsd:element>
<elm1 currency="yen" >
1000
</elm1>
<修正後(代替記述)>
<xsd:element name="elm1" type="intf:attDataBase2"/>
<xsd:complexType name="attDataBase1" >
<xsd:sequence>
<xsd:element name="price" type="xsd:int"/>
</xsd:sequence>
<xsd:attribute name="currency"
type="xsd:string" />
<xsd:attribute name="country"
type="xsd:string" />
</xsd:complexType >
<xsd:complexType name="attDataBase2" >
<xsd:sequence>
<xsd:element name="price" type="xsd:int"/>
</xsd:sequence>
<xsd:attribute name="currency"
type="xsd:string" />
</xsd:complexType >
<elm1 currency="yen">
<price xmlns="">1000</price>
</elm1>
attribute要素に指定するuse属性は非サポートです。attribute要素の出現可能性を型定義によって記述する場合には,その用途によってcomplexType要素を使用して,別の型として定義してください。
use属性を使用した記述の修正例を示します。
<修正前(非サポート)>
<xsd:complexType name="Use1">
<xsd:sequence>
<xsd:element name="data1"
type="intf:dataType" />
<xsd:element name="data2">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction
base="intf:dataType">
<xsd:sequence>
<xsd:element
name="data"
type="xsd:int"/>
</xsd:sequence>
<xsd:attribute
name="currency"
type="xsd:string"
use="prohibited" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType >
<xsd:complexType name="dataType" >
<xsd:sequence>
<xsd:element
name="data" type="xsd:int"/>
</xsd:sequence>
<xsd:attribute name="currency" type="xsd:string" />
</xsd:complexType >
<xsd:element name="use-1" type="intf:Use1"/>
<use-1 xmlns="http://localhost">
<data1 currency="yen" xmlns="" >
<data xmlns="">1000</data>
</data1>
<data2 xmlns="" >
<data xmlns="">1000</data>
</data2>
</use-1>
<修正後(代替記述)>
<xsd:complexType name="Use1">
<xsd:sequence>
<xsd:element name="data1" type="intf:dataType" />
<xsd:element name="data2" type="intf:dataType2" />
</xsd:sequence>
</xsd:complexType >
<xsd:complexType name="dataType" >
<xsd:sequence>
<xsd:element name="data" type="xsd:int"/>
</xsd:sequence>
<xsd:attribute name="currency" type="xsd:string" />
</xsd:complexType >
<xsd:complexType name="dataType2" >
<xsd:sequence>
<xsd:element name="data" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType >
<xsd:element name="use-1" type="intf:Use1"/>
element要素またはattribute要素にdefault属性を指定する場合で,SOAPメッセージの送信側のアプリケーションで値を設定しないとき,default属性の属性値はSOAPメッセージに設定されません。
SOAPメッセージの受信側のアプリケーションで,該当する属性値がSOAPメッセージに設定されていない場合は,default属性の属性値に指定されている値を設定してください。
element要素またはattribute要素にfixed属性を指定する場合,SOAPメッセージの送信側のアプリケーションでどのような値を設定しても,fixed属性の属性値がSOAPメッセージに設定されません。
SOAPメッセージの受信側のアプリケーションで,fixed属性に指定されている値を設定してください。
substitutionGroup属性は非サポートです。グローバルのelement要素に非サポートであるsubstitutionGroup属性を指定することはできません。
次に示す修正例を基に,代替記述について説明します。
このスキーマのインスタンスでは,トップレベルの要素”SSG”は,子要素として,data要素を内容とする構造です。このdata要素は,dataPattern1要素,dataPattern2要素の代わりに使用することができます。したがって,インスタンス2,インスタンス3も正しいXMLインスタンスとなります。Cosminexusでは,substitutionGroup属性をサポートしないため,代替要素となる型(ここでは,dataPattern1要素,dataPattern2要素)を使用する場合は,別のWSDLで記述し,別のアプリケーションとする必要があります。
<修正前(非サポート)>
<xsd:complexType name="SSG">
<xsd:sequence>
<xsd:element ref="intf:data" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="data" type="intf:dataType" />
<xsd:element name="dataPattern1"
type="intf:dataPattern1Type"
substitutionGroup="intf:data" />
<xsd:element name="dataPattern2"
type="intf:dataPattern2Type"
substitutionGroup="intf:data" />
<xsd:complexType name="dataType">
<xsd:sequence>
<xsd:element name="pno" type="xsd:NMTOKEN" />
<xsd:element name="date" type="xsd:string" />
<xsd:element name="season" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="dataPattern1Type">
<xsd:complexContent>
<xsd:extension base="intf:dataType" />
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="dataPattern2Type">
<xsd:complexContent>
<xsd:extension base="intf:dataType">
<xsd:sequence>
<xsd:element name="on"
type="xsd:string" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>
インスタンス1
<SSG xmlns="http://localhost">
<data>
<pno xmlns="">1967</pno>
<date xmlns="">Date</date>
<season xmlns="">SPRING</season>
</data>
</SSG>
インスタンス2
<SSG xmlns="http://localhost">
<dataPattern1>
<pno xmlns="">1967</pno>
<date xmlns="">Date</date>
<season xmlns="">SPRING</season>
</dataPattern1>
</SSG>
インスタンス3
<SSG xmlns="http://localhost">
<dataPattern2>
<pno xmlns="">1967</pno>
<date xmlns="">Date</date>
<season xmlns="">SPRING</season>
<on xmlns="">OFF</on>
</dataPattern2>
</SSG>
<修正後(代替記述)>
インスタンス1のスキーマ
<xsd:complexType name="SSG">
<xsd:sequence>
<xsd:element ref="intf:data" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="data" type="intf:dataType" />
<xsd:complexType name="dataType">
<xsd:sequence>
<xsd:element name="pno" type="xsd:NMTOKEN" />
<xsd:element name="date" type="xsd:string" />
<xsd:element name="season" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>
インスタンス2のスキーマ
<xsd:complexType name="SSG">
<xsd:sequence>
<xsd:element ref="intf:dataPattern1Type" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="dataPattern1" type="intf:dataType" />
<xsd:complexType name="dataType">
<xsd:sequence>
<xsd:element name="pno" type="xsd:NMTOKEN" />
<xsd:element name="date" type="xsd:string" />
<xsd:element name="season" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>
インスタンス3のスキーマ
<xsd:complexType name="SSG">
<xsd:sequence>
<xsd:element ref="intf:dataPattern2" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="dataPattern2"
type="intf: dataPattern2Type" />
<xsd:complexType name="dataPattern2Type">
<xsd:sequence>
<xsd:element name="pno" type="xsd:NMTOKEN" />
<xsd:element name="date" type="xsd:string" />
<xsd:element name="season" type="xsd:string" />
<xsd:element name="on" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>
mixed属性は非サポートです。complexType要素,complexContent要素にmixed属性で実現する,内容の中に要素が入る構造は実現できません。SOAPメッセージで送信しなければならないデータを,それぞれ独立した要素となる型を作成してください。
mixed属性を使用した記述の修正例を示します。
<修正前(非サポート)>
<xsd:complexType name="mixed">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="address">
<xsd:complexType>
<xsd:complexContent mixed="true" >
<xsd:extension base="intf:addressType">
<xsd:sequence>
<xsd:element name="postcode" type="xsd:int"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="addressType" mixed="true" >
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="mixed" type="intf:mixed"/>
<mixed xmlns="http://localhost">
<name xmlns="" >abcdef</name>
<address xmlns="" >
abcde<street>XXXX51st.</street>fghijk<city>ZZZZZZ</city>lmnopqrstuvwxyz <postcode>045981</postcode>
</address>
</mixed>
<修正後(代替記述)>
<xsd:complexType name="mixed">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="data1" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="data2" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="data3" type="xsd:string"/>
<xsd:element name="postcode" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="mixed" type="intf:mixed"/>
<mixed xmlns="http://localhost">
<name xmlns="" >abcdef</name>
<address xmlns="" >
<data1>abcde</data1>
<street>XXXX51st.</street>
<data2>fghijk</data2>
<city>ZZZZZZ</city>
<data3>lmnopqrstuvwxyz</data3>
<postcode>045981</postcode>
</address>
</mixed>
ENTITY型を指定してアプリケーションでデータを送受信できますが,ENTITY型としての機能は有効になりません。
WSDLのuse属性がliteralの場合,soapenc:Array型を制限した複合型を使用することはできません。配列を定義するには,代わりにmaxOccurs属性を指定した要素を子要素に持つ複合型を定義してください。
wsdl:arrayType属性を記述した場合の配列は,OUT属性およびINOUT属性で使用できません。
ref属性,minOccurs属性,およびmaxOccurs属性を同じelement要素で使用した場合,不正なソースが生成されます。ref属性,minOccurs属性,およびmaxOccurs属性を同じelement要素で使用しないでください。
ref属性,minOccurs属性,およびmaxOccurs属性を使用する場合の修正例を示します。
<修正前(非サポート)>
<xsd:complexType name="getUserData">
<xsd:sequence>
<xsd:element ref="intf:in0"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="in0" type="xsd:string"/>
<修正後(代替記述)>
<xsd:complexType name="getUserData">
<xsd:sequence>
<xsd:element name="in0" type="xsd:string"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>