2011-07-15 55 views
1

考慮以下Relax NG模式寫在Compact Syntax如何在Relax NG中實現約束/條件運算符?

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

特此像

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

任何XML文檔將被確認爲良好的。現在我想提出一些限制,例如元素值之間的一些依賴關係。例如

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

這會過濾掉一些無效的文件,如

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

RELAX NG並沒有提供一個明確的機制來編寫條件運算符的語法,所以我的問題是如何模仿這種行爲和實現一些元素和屬性值之間的依賴關係?

此外,如果您向我展示使用傳統DTD執行此操作的方式,我將非常感激。

任何幫助將不勝感激。提前致謝。

回答

2

此架構:

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]" }} 

可以用來驗證此文件:

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