如何在Relax NG中实现约束/条件运算符?

时间:2011-07-15 18:02:08

标签: xml xsd dependencies constraints relaxng

考虑使用Relax NG

编写的以下Compact Syntax架构
key = element key { type, value }
type = element type { text }
value = element value { text }

此处有任何XML文档,如

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

将被确认为格式良好。现在我想提出一些限制,例如元素值之间的某些依赖关系。例如

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执行此操作的方法,我将非常感激。

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分: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:错误:元素“value”的字符内容无效;必须是匹配正则表达式“[a-z]”

的字符串