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>
コードはXSD1.1で有効である必要があります。 XSD 1.0の場合、回避策を見つける必要があります。
「国籍」のものを独自の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>
アイテムの任意の長いリストを含む追加のノードを取得します。
マーク
同様の問題に遭遇し(各要素を任意の順序でいくつでも配置したかった)、一連の選択肢で解決しました。上記の例を使用すると:
<?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>
これにより、名前、メールアドレス、国籍を任意の数にすることができます。
あなたが探しているものは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>
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
または、「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>
xs:choice
動作しませんか?そうでない場合は、それをシーケンスでラップするか、またはその逆を行います。