2009-04-23 3 views
17

私は<key>サブ要素を持っている必要があります<property>要素のスキーマを作成しようとしている、と<val>の1、<shell>または<perl>とオプション<os>または<condition>、およびサブ要素の順序は重要ではありませんよ。私はこのために<xs:all>を使用して考え、理想的にはXMLスキーマ:なぜ<xs:all>には<choice>の子供がいませんか?どのようにこれをバイパスすることができますか?

<property> 
    <key>A</key> 
    <val>b</val> 
</property> 

<property> 
    <key>A</key> 
    <val>b</val> 
    <os>Windows</os> 
</property> 

<property> 
    <condition>a == 1</condition> 
    <key>A</key> 
    <perl>1+1</perl> 
    <os>unix</os> 
</property> 

:ここ

は有効な <property>要素のためのいくつかのサンプルです

<xs:element name="property"> 
    <xs:complexType> 
    <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:choice> 
     <xs:element name="val" type="xs:string" /> 
     <xs:element name="perl" type="xs:string" /> 
     <xs:element name="shell" type="xs:string" /> 
     </xs:choice> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
    </xs:all> 
    </xs:complexType> 
</xs:element> 

しかし、私は<xs:all>に含めることができることが分かっただけで<xs:element>ない<xs:choice> 。なぜ誰かがそれを説明できますか?

もっと重要なことに、誰かがそのような<property>要素を検証する方法を提供できますか? <xs:all>に任意元素として、私は、スキーマは3の1つのみが要素に存在することを検証する - <val><perl><shell> -

は、私は三つの要素を置くことができます。これはできますか? (xmllintでテスト)選択のための代替グループの使用についてのイモリさんのコメントに基づいて

+1

@splintor:質問を書くときに実際にプレビューウィンドウを見ましたか?私は、その半分は目に見えないものでした... – Tomalak

+0

あなたは、同じプロパティー要素内で発生する可能性がありますか、またはどちらか一方が発生する可能性がありますか? –

+0

@Tomalak:いいえ - 私はそのプレビューウィンドウを見逃しました。編集していただきありがとうございました。 – splintor

答えて

22

、「選択肢」として、今それ自身の要素である(typeFacet)、抽象的であるため直接使用することはできません。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="property"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:element ref="typeFacet" /> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="typeFacet" abstract="true" /> 
    <xs:element name="val" type="xs:string" substitutionGroup="typeFacet" /> 
    <xs:element name="perl" type="xs:string" substitutionGroup="typeFacet" /> 
    <xs:element name="shell" type="xs:string" substitutionGroup="typeFacet" /> 
</xs:schema> 
+0

これは改善です。 – 13ren

+0

はい、それはまさに私が意味していたものの、実際に行うにはあまりにも合っていました。抽象化は間違いなくここでも良いアイデアです。 –

+0

素晴らしいですが、私はXSDスキーマの置換について知らなかった。これは私が必要としていることをしているようです。ありがとう。 – splintor

6

は:

私はこれは少し優れていると思います
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="property"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:element ref="val"/> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="val" type="xs:string"/> 
    <xs:element name="perl" type="xs:string" substitutionGroup="val" /> 
    <xs:element name="shell" type="xs:string" substitutionGroup="val" /> 
</xs:schema> 
+0

素晴らしいですが、私はXSDスキーマの置換について知らなかった。これは私が必要としていることをしているようです。ありがとう。 – splintor

関連する問題

 関連する問題