任意顺序的两个/两个元素的RelaxNG紧凑模式

时间:2013-08-12 20:15:41

标签: xml relaxng

我正在为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}?
}

1 个答案:

答案 0 :(得分:5)

以下适用于我:

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

  a = element a {empty}
  b = element b {empty}
}