SDO 仕様は、モデル・グループ (all、choice、sequence、および group 参照) を正しい位置に展開して、タイプやプロパティーを記述しないことを必要としています。
基本的に、これは同じ収容構造の中にある構造は、すべて「フラット化される」ことを意味しています。この「フラット化」により、子構造は同じレベルに置かれます。このため、フラット化されたデータから構造が派生した SDO 内で、名前の重複の問題が生じる可能性があります。 XSD がグループをフラット化しない場合でも、さまざまな親に含まれている重複が個別に存在します。
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://MultipleGroup"> <xsd:complexType name="MultipleGroup"> <xsd:sequence> <xsd:choice> <xsd:element name="option1" type="xsd:string"/> <xsd:element name="option2" type="xsd:string"/> </xsd:choice> <xsd:element name="separator" type="xsd:string"/> <xsd:choice> <xsd:element name="option1" type="xsd:string"/> <xsd:element name="option2" type="xsd:string"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:schema>
option1 と option2 の複数のオカレンスは異なる choice ブロックに含まれており、それらの間には分離するエレメントさえあるため、XSD および XML は、それらを区別するのに何の問題もありません。しかし、SDO によってこれらのグループがフラット化されると、すべてのオプション・プロパティーは MultipleGroup という同じコンテナーに含まれます。
たとえ重複する名前がなくても、これらのグループをフラット化したことによる意味構造の問題もあります。例えば、以下の XSD を考えてみましょう。
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://SimpleChoice"> <xsd:complexType name="SimpleChoice"> <xsd:sequence> <xsd:choice> <xsd:element name="option1" type="xsd:string"/> <xsd:element name="option2" type="xsd:string"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:schema>
重複する名前の変更や XSD への特別な注釈の追加をユーザーに求めるのは実際的ではありません。なぜなら、多くの場合、規格や業界のスキーマのように、ユーザーは作業に使用している XSD を制御できないからです。
すべてのプロパティーに一貫性を持たせるために、ビジネス・オブジェクトは、重複した名前を持つプロパティーの個々のオカレンスに XPath を通じてアクセスするメソッドを含んでいます。EMF 命名規則によると、重複するプロパティー名が検出された場合、それらの名前に次の未使用の数字が付加されます。したがって、例えば次の XSD の場合:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://TieredGroup"> <xsd:complexType name="TieredGroup"> <xsd:sequence> <xsd:choice minOccurs="0"> <xsd:sequence> <xsd:element name="low" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:choice minOccurs="0"> <xsd:element name="width" minOccurs="0" maxOccurs="1" type="xsd:string"/> <xsd:element name="high" minOccurs="0" maxOccurs="1" type="xsd:string"/> </xsd:choice> </xsd:sequence> <xsd:element name="high" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:sequence> <xsd:element name="width" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:element name="high" minOccurs="0" maxOccurs="1" type="xsd:string"/> </xsd:sequence> <xsd:sequence> <xsd:element name="center" minOccurs="1" maxOccurs="1" type="xsd:string"/> <xsd:element name="width" minOccurs="0" maxOccurs="1" type="xsd:string"/> </xsd:sequence> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:schema>
先行する XSD は次の DataObject モデルを生成します。
DataObject - TieredGroup Property[0] - low - string Property[1] - width - string Property[2] - high - string Property[3] - high1 - string Property[4] - width1 - string Property[5] - high2 - string Property[6] - center - string Property[7] - width2 - string
ここで、width、width1、および width2 は width というプロパティーの名前で、この XSD 内の最初のものから始まります。high、high1、high2 も同様です。
これらの新しいプロパティー名は、参照と XPath に使用される名前にすぎず、シリアライズされた内容に影響しません。シリアライズされた XML 内に現れるこれらの各プロパティーの「真の」名前は、XSD 内で指定された値です。したがって、次の XML インスタンスの場合:
<?xml version="1.0" encoding="UTF-8"?> <p:TieredGroup xsi:type="p:TieredGroup" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://TieredGroup"> <width>foo</width> <high>bar</high> </p:TieredGroup>
これらのプロパティーにアクセスするためには、以下のコードを使用します。
DataObject tieredGroup = ... // 「foo」を表示する System.out.println(tieredGroup.get("width1")); // 「bar」を表示する System.out.println(tieredGroup.get("high2"));