web-dev-qa-db-ja.com

XSDallとXSDシーケンスの中間

XSDでユーザー要素を定義しています。この例では、ユーザーは名前、電子メール、および1つ以上の国籍を持っています。私はもう試した:

<xs:all>
  <xs:element name="name" blabla />
  <xs:element name="email" blabla />
  <xs:element name="nationality" minOccurs="1" maxOccurs="unbounded" />
</xs:all>

しかし、それは違法です。どうやら「すべて」内の要素は一度だけ発生することができます(またはまったく発生しません)。 AllをSequenceに変更することでこれを修正できますが、その場合、人々はプロパティを正確な順序で入力する必要があり、実際には気にしません。

これら2つの組み合わせはありますか? http://www.w3schools.com/Schema/schema_complex_indicators.asp によるとではありませんが、おそらく隠されています(または私の経験の浅い目では見えません)。

直感的に、私も試しました:

<xs:all>
  <xs:element name="name" blabla />
  <xs:element name="email" blabla />
  <xs:sequence>
    <xs:element name="nationality" minOccurs="1" maxOccurs="unbounded" />
  </xs:sequence>
</xs:all>

しかし、それは残念ながら無効です。


これが現在の実際のXSDです。

  <!-- user -->
  <xs:complexType name="user">
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" minOccurs="1" maxOccurs="1" />
      <xs:element name="appendix" type="xs:string" minOccurs="0" maxOccurs="1" />
      <xs:element name="lastname" type="xs:string" minOccurs="1" maxOccurs="1" />
      <xs:element name="address" type="xs:string" minOccurs="1" maxOccurs="1" />
      <xs:element name="zipcode" type="xs:string" minOccurs="1" maxOccurs="1" />
      <xs:element name="city" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="username" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="email" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="country" type="country" minOccurs="1" maxOccurs="1"/>
      <xs:element name="nationality" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
25

コードはXSD1.1で有効である必要があります。 XSD 1.0の場合、回避策を見つける必要があります。

3
jelovirt

「国籍」のものを独自のcomplexTypeに変換してから、xs:all内でその新しい複合型を使用できますか?

<xs:complexType name="NationalityType">
  <xs:sequence>   
    <xs:element name="nationality" minOccurs="1" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>

<xs:all>
  <xs:element name="name" blabla />
  <xs:element name="email" blabla />
  <xs:element name="nationalities" type="NationalityType" />
</xs:all>

これをテストするものが手元にないので、これは本当に頭のてっぺんから外れています.....試してみてください!

編集:今までにそれをテストしました-それは機能します、支払うべき唯一のマイナーな代償はあなたのXMLがこのように見える必要があるということです:

<....>
  <email>......</email>
  <nationalities>
    <nationality>ABC</nationality>
    <nationality>CDE</nationality>
  </nationalities>
  <name>.....</name>
</.....>

したがって、<nationality>アイテムの任意の長いリストを含む追加のノードを取得します。

マーク

21
marc_s

同様の問題に遭遇し(各要素を任意の順序でいくつでも配置したかった)、一連の選択肢で解決しました。上記の例を使用すると:

<?xml version='1.0' encoding='UTF-8'?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name='user'>
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:choice>
          <xs:element name="name" type="xs:string" />
          <xs:element name="email" type="xs:string" />
          <xs:element name="nationality" />
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

これにより、名前、メールアドレス、国籍を任意の数にすることができます。

20
fangster

あなたが探しているものはXMLの意図に反すると思います。次のような有効なXMLフラグメントがあるのは奇妙に思えます。

<user>
  <nationality/>
  <name/>
  <nationality/>
  <email/>
  <nationality/>
</user>

Marc_sが提案したようなものを求めているようです。

<user>
  <name/>
  <email/>
  <nationality/>
  <nationality/>
  <nationality/>
<user>

押し込む必要があるもの:

<user>
  <name/>
  <email/>
  <nationalities>
     <nationality/>
     <nationality/>
     <nationality/>
  </nationalities>
<user>
7
Jeremy Stein

XSD 1.0の場合、leppieからの提案は機能します。

XSD

<?xml version='1.0' encoding='UTF-8'?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name='user'>
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string" />
        <xs:element name="email" type="xs:string" />
        <xs:choice minOccurs='0' maxOccurs='unbounded'>
          <xs:element name="nationality" />
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

スキーマに対して検証するサンプルXMLドキュメント

<user>
  <name>Name</name>
  <email>[email protected]</email>
  <nationality>Italian</nationality>
  <nationality>Japanese</nationality>
  <nationality>Alien</nationality>
</user>

そして検証、例えばxmllintを使用

xmllint --noout --schema test.xsd test.xml
test.xml validate
1
ugo

または、「USER」は複数の子要素で設定されるので、複合型として設定してみませんか?このようなものが機能するはずです。

<xs:complexType>
  <xs:sequence>
    <xs:element name="Name" type="xs:string" />
    <xs:element name="Password" type="xs:string" />
    <xs:element minOccurs="1" maxOccurs="unbounded" name="Nationality" type="xs:string" />
  </xs:sequence>
</xs:complexType>
0
AllenG

xs:choice動作しませんか?そうでない場合は、それをシーケンスでラップするか、またはその逆を行います。

0
leppie