2011-07-15 7 views
1

Compact SyntaxRelax NGで制約条件演算子を実装する方法は?

key = element key { type, value } 
type = element type { text } 
value = element value { text } 

で書かれた以下のRelax NGスキーマを考えてみましょうこれによって

<key> 
    <type>someType</type> 
    <value>someValue</value> 
</key> 

のような任意のXMLドキュメントは、同様に形成された確認されます。今私はいくつかの制約を入れたいと思います。要素値の間のいくつかの依存関係。私の質問は、このような動作をエミュレートする方法であるので、例えばこれは

<key> 
    <type>letter</type> 
    <value>7</value> 
</key> 
<!-- illegal - 7 is not a letter ! --> 

のようないくつかの無効なドキュメントを除外します

if type:text = "digit" then value:text = "[0-9]" else 
if type:text = "letter" then value:text = "[a-z]" 

リラックスNGの構文は、条件演算子を書き込むための明示的なメカニズムを提供していないといくつかの要素と属性の値の間の依存関係を実装するか?

古典的なDTDを使用してこれを実行する方法を示してもらえれば、ありがたく思っています。

何か助けていただければ幸いです。前もって感謝します。

答えて

2

このスキーマ:

<key> 
    <type>letter</type> 
    <value>7</value> 
</key> 

Jingレポート:

so.xml:3:20: error: character content of element "value" invalid; must be a string matching the regular expression "[a-z]"

start = key 
key = element key { (type1, value1) | (type2, value2) } 

type1 = element type { "letter" } 
type2 = element type { "digit" } 

value1 = element value { xsd:string { pattern = "[a-z]" }} 
value2 = element value { xsd:string { pattern = "[0-9]" }} 

は、この文書を検証するために使用することができます

関連する問題