2009-08-07 11 views
0

XSDを使用してノード名をリストに戻すことは可能ですか?この列挙に基づいて別の制限を追加できますか?例でXSD制限

、私はこのXMLを持っている:

<a> 
    <b name="string" value="hello"> 
    <b name="integer" value="123"> 
</a> 

私が "B" ノードを望ん列挙{ "string" は、 "整数"}からname属性を有しています。 それは "文字列"の場合、私はその "値"属性がxs:文字列のタイプ、 であり、それが "整数"であれば、その "値"属性をxs:integerの型にします。

答えて

1

いいえこれはXSDでは実行できません。本質的には、異なるタイプの2つの<があります。これはElement Consistency ruleに違反しています。

あなたはいくつかのオプションがあり、

  1. は、アプリケーションで、スキーマの外にルールを適用します。これは私がやることです。
  2. 他の人が触れたように、Schematronのような検証言語を使用してください。
  3. Relax NGのようなより強力なスキーマ言語に切り替えます。
+0

ちょうど私がthougth。ご回答有難うございます。 – ppiotrowicz

1

あなたは特定の制限を設けることができます。 name属性の値が指定されたリストから来るように制限することはできますが、XMLスキーマの "if name is string、次に値の型はxs:stringでなければなりません"というような関係を表現することはできません。

他の手法(Schematronなど)を使用するか、アプリコードでこれをチェックする必要があります。

マルク・

+0

お返事ありがとうございます。私はschematronにもっと近く見るでしょう。 – ppiotrowicz

0

号しかし、あなたはタイプのような名前の治療している - とXMLスキーマは、文字列の値によって決定される要素のcomplexTypeのためのいくつかのサポートを持っていません。ただし、属性名を使用する必要があります:あなたのXML文書で「XSIタイプ」、それは次のようになります。

そのXMLスキーマは、私は怖いできる最善だ
<a> 
    <b xsi:type="string" value="hello"> 
    <b xsi:type="integer" value="123"> 
</a> 

。公式プライマリの詳細(残念ながら、かなり混乱する可能性があります): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs