2011-07-15 28 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]"