我正在为XML文件编写RelaxNG Compact模式,其中<wrap>
元素的内容必须是以下之一:
<wrap><a/></wrap>
<wrap><b/></wrap>
<wrap><a/><b/></wrap>
<wrap><b/><a/></wrap>
在英语中,<a/>
或<b/>
各允许一次,或两者都允许,但其中一个必须出现。< / em>的
WrapElement
的定义是否比以下更好(更紧凑)?
grammar {
start =
element wrap { WrapElement }
WrapElement =
(
element a {empty},
element b {empty}?
)|(
element a {empty},
element b {empty}?
)
}
以下是结束。它肯定更简洁,它匹配所有允许的变化,并且不允许元素多次出现。但是,它也错误地允许空<wrap/>
元素:
grammar {
start =
element wrap { WrapElement }
WrapElement =
element a {empty}?
& element b {empty}?
}
答案 0 :(得分:5)
以下适用于我:
grammar {
start =
element wrap { (a|b)|(a&b) }
a = element a {empty}
b = element b {empty}
}