[IMP] put better constraints on @position and *[@position='attributes']/attribute
authorXavier Morel <xmo@openerp.com>
Tue, 27 Jul 2010 15:40:47 +0000 (17:40 +0200)
committerXavier Morel <xmo@openerp.com>
Tue, 27 Jul 2010 15:40:47 +0000 (17:40 +0200)
bzr revid: xmo@openerp.com-20100727154047-d9fg100zvrukgdy9

bin/addons/base/rng/view.rng

index 4e649f8..0b53684 100644 (file)
@@ -1,12 +1,50 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0">
+<rng:grammar xmlns:rng="http://relaxng.org/ns/structure/1.0"
+              datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <!-- Handling of element overloading when inheriting from a base
+       template
+  -->
+  <rng:define name="overload">
+    <rng:optional>
+      <!--
+          Alter matched element with content
+      -->
+      <rng:choice>
+        <rng:attribute name="position">
+          <rng:choice>
+            <!-- Insert content before first child -->
+            <rng:value>before</rng:value>
+            <!-- Insert content after last child -->
+            <rng:value>after</rng:value>
+            <!-- Replace all children with content -->
+            <rng:value>inside</rng:value>
+            <!-- Replace matched element itself with content -->
+            <rng:value>replace</rng:value>
+          </rng:choice>
+        </rng:attribute>
+        <rng:group>
+          <rng:attribute name="position">
+            <!-- Edit element attributes -->
+            <rng:value>attributes</rng:value>
+          </rng:attribute>
+          <rng:oneOrMore>
+            <rng:element name="attribute">
+              <rng:attribute name="name"><rng:text/></rng:attribute>
+              <rng:text />
+            </rng:element>
+          </rng:oneOrMore>
+        </rng:group>
+      </rng:choice>
+    </rng:optional>
+  </rng:define>
+
     <rng:define name="form">
         <rng:element name="form">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="col"/></rng:optional>
             <rng:optional><rng:attribute name="editable"/></rng:optional>
             <rng:optional><rng:attribute name="type"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="link"/></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
@@ -21,7 +59,6 @@
                     <rng:ref name="image"/>
                     <rng:ref name="form"/>
                     <rng:ref name="vpaned"/>
-                    <rng:ref name="attribute"/>
                     <rng:ref name="filter"/>
                     <rng:ref name="html"/>
                     <rng:element name="newline"><rng:empty/></rng:element>
 
     <rng:define name="tree">
         <rng:element name="tree">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="colors"/></rng:optional>
             <rng:optional><rng:attribute name="color"/></rng:optional>
             <rng:optional><rng:attribute name="editable"/></rng:optional>
             <rng:optional><rng:attribute name="toolbar"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="link"/></rng:optional>
             <rng:optional><rng:attribute name="type"/></rng:optional>
             <rng:optional><rng:attribute name="limit"/></rng:optional>
                     <rng:ref name="tree"/>
                     <rng:ref name="group"/>
                     <rng:ref name="button"/>
-                    <rng:ref name="attribute"/>
                     <rng:ref name="filter"/>
                     <rng:ref name="html"/>
                     <rng:element name="newline"><rng:empty/></rng:element>
 
     <rng:define name="search">
         <rng:element name="search">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="col"/></rng:optional>
             <rng:optional><rng:attribute name="type"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="link"/></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
 
     <rng:define name="label">
         <rng:element name="label">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="align"/></rng:optional>
             <rng:optional><rng:attribute name="nolabel"/></rng:optional>
             <rng:optional><rng:attribute name="colspan"/></rng:optional>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="angle"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="fill"/></rng:optional>
             <rng:optional><rng:attribute name="help"/></rng:optional>
             <rng:optional><rng:attribute name="width"/></rng:optional>
 
     <rng:define name="hpaned">
         <rng:element name="hpaned">
-            <rng:optional><rng:attribute name="position"/></rng:optional>
+            <rng:optional>
+              <rng:attribute name="position">
+                <rng:data type="int"/>
+              </rng:attribute>
+            </rng:optional>
             <rng:zeroOrMore>
                 <rng:ref name="any" />
                 <rng:optional><rng:ref name="html"/></rng:optional>
 
     <rng:define name="vpaned">
         <rng:element name="vpaned">
-            <rng:optional><rng:attribute name="position"/></rng:optional>
+            <rng:optional>
+              <rng:attribute name="position">
+                <rng:data type="int"/>
+              </rng:attribute>
+            </rng:optional>
             <rng:zeroOrMore>
                 <rng:optional><rng:ref name="any"/></rng:optional>
                 <rng:optional><rng:ref name="html"/></rng:optional>
 
     <rng:define name="page">
         <rng:element name="page">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="groups"/></rng:optional>
             <rng:optional><rng:attribute name="attrs"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
                     <rng:element name="newline"><rng:empty/></rng:element>
                     <rng:element name="properties"><rng:empty/></rng:element>
-                    <rng:ref name="attribute" />
                     <rng:ref name="label" />
                     <rng:ref name="field"/>
                                <rng:ref name="shortcut"/>
 
     <rng:define name="notebook">
         <rng:element name="notebook">
-            <rng:optional><rng:attribute name="position"/></rng:optional>
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="colspan"/></rng:optional>
             <rng:optional><rng:attribute name="tabpos"/></rng:optional>
             <rng:oneOrMore>
 
     <rng:define name="separator">
         <rng:element name="separator">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="colspan"/></rng:optional>
             <rng:optional><rng:attribute name="rowspan"/></rng:optional>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="col"/></rng:optional>
             <rng:optional><rng:attribute name="select"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="orientation"/></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
-                    <rng:ref name="attribute"/>
                     <rng:ref name="separator"/>
                     <rng:ref name="button"/>
                     <rng:ref name="field"/>
     <rng:define name="xpath">
         <rng:element name="xpath">
             <rng:optional><rng:attribute name="expr"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
+            <rng:ref name="overload"/>
             <rng:zeroOrMore>
                 <rng:choice>
                     <rng:ref name="any"/>
         </rng:element>
     </rng:define>
 
-    <rng:define name="attribute">
-        <rng:element name="attribute">
-            <rng:attribute name="name" />
-            <rng:zeroOrMore>
-                <rng:text />
-            </rng:zeroOrMore>
-        </rng:element>
-    </rng:define>
-
-
     <rng:define name="field">
         <rng:element name="field">
             <rng:attribute name="name" />
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="editable"/></rng:optional>
             <rng:optional><rng:attribute name="attrs"/></rng:optional>
             <rng:optional><rng:attribute name="string"/></rng:optional>
             <rng:optional><rng:attribute name="context"/></rng:optional>
             <rng:optional><rng:attribute name="groups"/></rng:optional>
             <rng:optional><rng:attribute name="states"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="digits"/></rng:optional>
             <rng:optional><rng:attribute name="icon"/></rng:optional>
             <rng:optional><rng:attribute name="mode"/></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
                     <rng:ref name="diagram"/>
-                    <rng:ref name="attribute" />
                     <rng:ref name="form"/>
                     <rng:ref name="data"/>
                     <rng:ref name="tree"/>
 
     <rng:define name="group">
         <rng:element name="group">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="attrs"/></rng:optional>
             <rng:optional><rng:attribute name="col"/></rng:optional>
             <rng:optional><rng:attribute name="colspan"/></rng:optional>
             <rng:optional><rng:attribute name="rowspan"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="expand"/></rng:optional>
             <rng:optional><rng:attribute name="states"/></rng:optional>
             <rng:optional><rng:attribute name="groups"/></rng:optional>
             <rng:optional><rng:attribute name="color" /></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
-                    <rng:ref name="attribute"/>
                     <rng:ref name="separator"/>
                     <rng:ref name="button"/>
                     <rng:ref name="field"/>
 
     <rng:define name="button">
         <rng:element name="button">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="attrs"/></rng:optional>
             <rng:optional><rng:attribute name="invisible"/></rng:optional>
             <rng:optional><rng:attribute name="name" /></rng:optional>
             <rng:optional><rng:attribute name="groups"/></rng:optional>
             <rng:optional><rng:attribute name="target"/></rng:optional>
             <rng:optional><rng:attribute name="readonly"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="context"/></rng:optional>
             <rng:optional><rng:attribute name="confirm"/></rng:optional>
             <rng:optional><rng:attribute name="help"/></rng:optional>
             <rng:optional><rng:attribute name="default_focus"/></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
-                    <rng:ref name="attribute" />
                     <rng:ref name="form" />
                     <rng:ref name="field" />
                     <rng:ref name="tree" />
 
     <rng:define name="filter">
         <rng:element name="filter">
+            <rng:ref name="overload"/>
             <rng:optional><rng:attribute name="attrs"/></rng:optional>
             <rng:optional><rng:attribute name="name" /></rng:optional>
             <rng:optional><rng:attribute name="separator" /></rng:optional>
             <rng:optional><rng:attribute name="colspan"/></rng:optional>
             <rng:optional><rng:attribute name="groups"/></rng:optional>
             <rng:optional><rng:attribute name="readonly"/></rng:optional>
-            <rng:optional><rng:attribute name="position"/></rng:optional>
             <rng:optional><rng:attribute name="context"/></rng:optional>
             <rng:optional><rng:attribute name="help"/></rng:optional>
             <rng:optional><rng:attribute name="domain"/></rng:optional>