RELAX NG具有相同结构的元素的多个名称

时间:2012-11-08 11:22:55

标签: xml relaxng

假设我有两个这样的规则:

JFalse = element JFalse {
   attribute label { xs:string }?,
   attribute jump { xs:string }?,
   attribute offset { xs:integer }?
}

JGt = element JGt {
   attribute label { xs:string }?,
   attribute jump { xs:string }?,
   attribute offset { xs:integer }?
}

(实际上相当多)

我想做的事情显然是:

JFalseOrJGt = element (JFalse | JGt) {
   attribute label { xs:string }?,
   attribute jump { xs:string }?,
   attribute offset { xs:integer }?
}

(但上述内容无效)。我可以用其他方式来做,这将导致更“压缩”的语法规则吗?

2 个答案:

答案 0 :(得分:3)

这是一个选择:

JFalse = element JFalse { jFalseGt }

JGt = element JGt { jFalseGt }

jFalseGt = 
   attribute label { xs:string }?,
   attribute jump { xs:string }?,
   attribute offset { xs:integer }?

答案 1 :(得分:0)

语法element (JFalse | JGt)实际上是用于声明可以具有两个名称之一的元素的正确语法。从紧凑语法转换为XML语法时,trang会将其转换为:

<element> <choice> <name>JFalse</name> <name>JGt</name> </choice> [...]

这正是你所要求的。

您的代码中存在错误,但它与命名元素无关。问题是无法解析所有xs:...类型。您有两种选择:在文件开头添加datatypes xs = "http://www.w3.org/2001/XMLSchema-datatypes"以声明xs前缀,或者编辑每种类型以使用xsd前缀而不是xs 。默认情况下声明xsd前缀。