2009-05-08 15 views
25

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

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

しかし、それは違法です。どうやら、 "All"内の要素は1回だけ発生する(または全く発生しない)ことができます。 All to a 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> 

しかし、それは残念ながら無効です:直感によって

は、私も試してみました。

<!-- 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> 

答えて

3

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

+26

XSD 1.1の使用、作成、オプトイン、作成、隠し、移行、インスタンス化、検索、または使用はどのようにして行われますか? –

+3

XSD 1.1とXSD 1.0の違いが1.1で有効、1.0で無効になっていますか? –

+0

1.1の仕様では、私はOPのXMLを違法にする制約について言及していません。悲しいことに、私は比較することができる1.0仕様を見つけることができません。私の推測では、XML/XSDを解析するlibsのバージョンをチェックして、下のトリックが必要かどうかを知る必要があるということです。 –

21

は、あなただけの独自のcomplexTypeのにあなたの「国籍」thingieをオンにしてから、その新しい複合型をお使いのxs内で使用することができます:ここで


は、XSDの現在、本当の、一枚あるすべての?

<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> 

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

EDITは:今ではそれをテスト - それが動作し、支払うためにわずかな価格があなたのXMLは、このような何かを見ているということです。

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

ですから、任意に含まれます余分なノードを取得します<nationality>の長いリスト

マルク・

+4

この回答は唯一正しいものです。あなたが必要とするものは、国籍の配列です。他のすべての方法は、XMLの原則を破るハックです。 –

0

あるいは、「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> 
+1

これはすでに複合型です。本当のXSDを質問に追加したので、あなたもそれを見ることができます:) –

0

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

+0

?どのように役立つだろうか?例を挙げてください。 –

7

あなたが探しているのは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> 
1

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> 

スキーマ例えば

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

および検証に対して検証サンプルXML文書ただ、同様の問題に遭遇しxmllint

xmllint --noout --schema test.xsd test.xml 
test.xml validate 
+0

あなたが提供した例では、「選択」の必要はありません。 'sequence'要素を内部で使用する限り、maxOccurs = "unbounded"を持つことができます。しかし、シーケンスは内部の要素の順序を強制します - それは最初の質問の問題でした。 –

+0

この回答は、モデルグループ要素 'all'、' sequence'と 'choice'をネストできることを示しています。同様に、少なくとも1.1では、グループを定義して参照することができます.http://www.w3.org/TR/xmlschema11-1/#cModel_Group_Definitionsを参照してください。これにより、marc_sの答えとして新しい 'container'要素を追加しないようにします。 –

20

を使用して(私は、任意の順序で各要素の任意の数を持っていると思った)と選択肢の順序でそれを解決しました。上記の例を使用すると:

<?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> 

これにより、任意の数の名前、電子メール、国籍を任意の順序で持つことができます。

+6

しかし、これはの中に複数の要素を許可しますか? –