2

子要素を任意の順序で配置できる XSD を作成しようとしています。ただし、各子要素には独自の minOccurs と maxOccurs があります。

私のXSD:

<xsd:complexType name="Samples">
<xsd:sequence > 
  <xsd:element name="Sample1" minOccurs="1" maxOccurs="1">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:boolean" />
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string" />
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
</xsd:sequence>

有効な XML の例:

<Samples>
<Sample2></Sample2>
<Sample1></Sample1>
<Sample2></Sample2>
</Samples>

無効な XML の例 (Sample1 は 1 回しか選択できません):

<Samples>
<Sample2></Sample2>
<Sample1></Sample1>
<Sample2></Sample2>
<Sample1></Sample1>
</Samples>

しかし、すべての要素に独自の制約がありますが、どのように順序を混在させることができるのかわかりません。

手伝ってくれてありがとう

4

2 に答える 2

2

これを試してみるとどうなりますか:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Samples">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="Sample1" minOccurs="1" maxOccurs="1"/>  
        <xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

もちろん、各要素に制限を追加する必要があります。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:complexType name="Sample1Type">
      <xsd:simpleContent>
        <xsd:extension base="xsd:boolean" />
      </xsd:simpleContent>
   </xsd:complexType>
   <xsd:complexType name="Sample2Type">
      <xsd:simpleContent>
        <xsd:extension base="xsd:string" />
      </xsd:simpleContent>
   </xsd:complexType>
  <xsd:element name="Samples">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element type="Sample1Type" name="Sample1" minOccurs="1" maxOccurs="1"/>  
        <xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

または、単純なタイプの場合はさらに短くなります:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Samples">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element type="xsd:boolean" name="Sample1" minOccurs="1" maxOccurs="1"/>  
        <xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

PS: :

xsd:sequence残念ながら、あなたが求めるものを許可する のような XSD 要素はありません。

于 2011-12-21T13:00:51.793 に答える
0

必要なものは xsd:all; のようになります。ただし、xsd:all は maxOccurs が 1 の要素に対してのみ機能するため、ここでは機能しません。選択肢とシーケンスを組み合わせてコンテンツを制限できる場合、定義の重複を回避する (2 回定義するのを避ける) 1 つの方法は、Sample1 と Sample 2 をグローバル要素として定義し、コンポジターでそれらを参照することです。グローバル要素を定義することがルート要素以外のオプションではない場合、少なくとも型をグローバルに定義できます。このようにして、再利用を最大化し、「2回定義することなく」要件にいくらか近づくことができます...

于 2011-12-21T20:12:10.667 に答える