1

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

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 }?
}

(但以上无效)。我可以以其他方式做到这一点,这会导致更“压缩”的语法规则吗?

4

2 回答 2

3

这是一种选择:

JFalse = element JFalse { jFalseGt }

JGt = element JGt { jFalseGt }

jFalseGt = 
   attribute label { xs:string }?,
   attribute jump { xs:string }?,
   attribute offset { xs:integer }?
于 2012-11-08T12:06:19.367 回答
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前缀是默认声明的。

于 2018-04-12T14:04:06.363 回答