4

我正在为 XML 文件编写一个 RelaxNG Compact 模式,其中元素的内容<wrap>必须完全是以下之一:

<wrap><a/></wrap>
<wrap><b/></wrap>
<wrap><a/><b/></wrap>
<wrap><b/><a/></wrap>

在英语中,一个<a/>或一个<b/>被允许一次,或者两者都允许,但其中一个必须出现

是否有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}?
}
4

1 回答 1

5

以下对我有用:

grammar {
  start = 
    element wrap { (a|b)|(a&b) }

  a = element a {empty}
  b = element b {empty}
}
于 2013-08-12T20:59:48.213 回答