2011-08-09 14 views
1

「オブジェクト」ノードの子が「テキスト」ノードまたは「イメージ」ノードのいずれかを表示するように作成する方法とXSDについて固まっています回数と任意の順序で。 「オブジェクト」ノード内に表示される順序によってレンダリング方法が決まりますが、順序を検証する必要はありません。任意の順序で任意の回数表示される混在コンテンツを持つXSDノード

例1

<objects> 
    <textobject x="30" y="100" value="blah1" /> 
    <imageobject x="0" y="0" src="/path/to/some/image1.png"/> 
    <imageobject x="0" y="0" src="/path/to/some/image2.png"/> 
    <textobject x="60" y="250" value="blah2" /> 
    <textobject x="60" y="250" value="blah3" /> 
</objects> 

例2

<objects> 
    <imageobject x="0" y="0" src="/path/to/some/image1.png"/> 
    <textobject x="30" y="100" value="blah1" /> 
    <textobject x="60" y="250" value="blah2" /> 
    <imageobject x="0" y="0" src="/path/to/some/image2.png"/> 
    <textobject x="60" y="250" value="blah3" /> 
</objects> 

感謝!

答えて

1

あなたはminOccurs="0"maxOccurs="unbounded"xs:choiceを使用することができます。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="objects"> 
    <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="imageobject"/> 
     <xs:element ref="textobject"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="imageobject"> 
    <xs:complexType> 
     <xs:attribute name="src" use="required"/> 
     <xs:attribute name="x" use="required" type="xs:integer"/> 
     <xs:attribute name="y" use="required" type="xs:integer"/> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="textobject"> 
    <xs:complexType> 
     <xs:attribute name="value" use="required"/> 
     <xs:attribute name="x" use="required" type="xs:integer"/> 
     <xs:attribute name="y" use="required" type="xs:integer"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

ありがとうございます: 復旧可能な解析エラー:org.xml.sax.SAXParseException:src-resolve: 'imageobject'という名前を(n) '要素宣言'コンポーネントに解決できません。 回復可能な解析エラー:org.xml.sax.SAXParseException:src-resolve: 'textobject'という名前を(n) '要素宣言'コンポーネントに解決できません。 SAXException:cvc-complex-type.2.4.d:要素 'imageobject'で始まる無効な内容が見つかりました。この時点では子要素はありません。 – kreek

+0

提供されているスキーマは有効です - 私はSaxonでテストしました。おそらくあなたは何らかの方法でそれを変更しました。名前空間を追加します。 –

1

<xs:choice maxOccurs="unbounded">を使用してください。

3

このような状況では、うまく置換グループを使用することが適切です。 "textObject"と "imageObject"を置換グループのメンバーとして抽象要素として "mediaObject"を定義し、コンテンツモデルを<xs:element ref="mediaObject" minOccurs="0" maxOccurs="unbounded"/>と定義します。この設計の利点は、より拡張性があり、懸念の分離、セマンティクスのより良い表現、および定義の再利用性の向上です。メリットは実際に2つではなく15種類のメディアオブジェクトが存在するときに実際に表示され始めます。

+0

優れた提案。 –

関連する問題