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

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

解决方法

以下适用于我:

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

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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念