namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"

tree = element tree { attlist.tree,
    (field
     | button)*
  }
attlist.tree &=
  [ a:defaultValue = "Unknown" ] attribute string { text }?
attlist.tree &= attribute on_write { text }?
attlist.tree &= attribute editable { "top" | "bottom" }?
attlist.tree &= attribute sequence { text }?
attlist.tree &= attribute colors { text }?
attlist.tree &=
  [ a:defaultValue = "0" ] attribute keyword_open { "0" | "1" }?
field = element field { attlist.field, empty }
attlist.field &= attribute name { text }
attlist.field &= attribute readonly { "0" | "1" }?
attlist.field &=
  attribute widget {
    "char"
    | "many2one"
    | "date"
    | "one2many"
    | "selection"
    | "float"
    | "numeric"
    | "float_time"
    | "integer"
    | "datetime"
    | "boolean"
    | "text"
    | "url"
    | "email"
    | "callto"
    | "sip"
    | "progressbar"
  }?
attlist.field &=
  [ a:defaultValue = "0" ] attribute tree_invisible { "0" | "1" }?
attlist.field &=
  [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
attlist.field &= attribute icon { text }?
attlist.field &= attribute sum { text }?
attlist.field &= attribute width { text }?
attlist.field &=
  [ a:defaultValue = "left_to_right" ] attribute orientation {
    "left_to_right"
    | "right_to_left"
    | "bottom_to_top"
    | "top_to_bottom"
  }?
attlist.field &= attribute float_time { text }?
button = element button { attlist.button, empty }
attlist.button &= attribute help { text }?
attlist.button &=
  [ a:defaultValue = "Unknown" ] attribute string { text }?
attlist.button &=
  [ a:defaultValue = "object" ]
  attribute type { "object" | "action" }?
attlist.button &= attribute confirm { text }?
attlist.button &= attribute name { text }
attlist.button &= attribute states { text }?
data = element data { attlist.data, xpath+ }
attlist.data &= empty
xpath = element xpath { attlist.xpath,
    (field
    | button
    | tree
    )*
  }
attlist.xpath &= attribute expr { text }
attlist.xpath &=
  [ a:defaultValue = "inside" ]
  attribute position { "inside" | "replace" | "replace_attributes" | "after" | "before" }?
start = tree | data
