<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:621572820;
        mso-list-type:hybrid;
        mso-list-template-ids:788950258 134807569 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l0:level1
        {mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1
        {mso-list-id:1143934092;
        mso-list-type:hybrid;
        mso-list-template-ids:2107772560 -1984674106 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l1:level1
        {mso-level-number-format:alpha-upper;
        mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
@list l1:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-GB link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hi,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>We were recently discussing the permitted placement of the following statements:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>ROUTE<o:p></o:p></p><p class=MsoNormal>IMPORT<o:p></o:p></p><p class=MsoNormal>EXPORT<o:p></o:p></p><p class=MsoNormal>PROTODECLARE<o:p></o:p></p><p class=MsoNormal>EXTERNPROTODECLARE<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The original discussion centred on the draft JSON encoding. However, I have now been looking at this in the XML and Classic VRML encodings.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Let’s take a look at what is permitted by these encodings, and also compare what the abstract standard says.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Let’s take the Classic VRML encoding first, i.e. ISO/IEC 19776-2 V3.3. The most comprehensive description is the grammar in Annex A.2.<o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19776-2/V3.3/Part02/grammar.html#General">http://www.web3d.org/documents/specifications/19776-2/V3.3/Part02/grammar.html#General</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>A non-terminal “statement” is defined as:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>nodeStatement</span></i><span style='mso-fareast-language:EN-GB'> | <br><i>importStatement</i> |<br><i>exportStatement </i>|<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>protoStatement</span></i><span style='mso-fareast-language:EN-GB'> | <o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>routeStatement</span></i><span style='mso-fareast-language:EN-GB'> ; <o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The non-terminal “nodeStatement” can be followed down to “node”, “nodeBody”, and “nodeBodyElement”. This last non-terminal has the definition:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>initializeOnlyId fieldValue</span></i><span style='mso-fareast-language:EN-GB'> | <br><i>inputOutputId fieldValue |</i><o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>initializeOnlyId </span></i><b><span style='mso-fareast-language:EN-GB'>IS</span></b><i><span style='mso-fareast-language:EN-GB'> initializeOnlyId</span></i><span style='mso-fareast-language:EN-GB'> | <o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>inputOnlyId </span></i><b><span style='mso-fareast-language:EN-GB'>IS</span></b><i><span style='mso-fareast-language:EN-GB'> inputOnlyId</span></i><span style='mso-fareast-language:EN-GB'> | <o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>outputOnlyId </span></i><b><span style='mso-fareast-language:EN-GB'>IS</span></b><i><span style='mso-fareast-language:EN-GB'> outputOnlyId</span></i><span style='mso-fareast-language:EN-GB'> | <o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>inputOutputId </span></i><b><span style='mso-fareast-language:EN-GB'>IS</span></b><i><span style='mso-fareast-language:EN-GB'> inputOutputId</span></i><span style='mso-fareast-language:EN-GB'> | <o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>routeStatement</span></i><span style='mso-fareast-language:EN-GB'> | <o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><i><span style='mso-fareast-language:EN-GB'>protoStatement</span></i><span style='mso-fareast-language:EN-GB'> ; <o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Notice the lack or importStatement and exportStatement.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This has been pointed out previously. In fact, Mantis issue 698 covers this very point.<o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/member-only/mantis/view.php?id=698">http://www.web3d.org/member-only/mantis/view.php?id=698</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Now let’s take the XML encoding, ISO/IEC 19776-1 V3.3. Let’s look at an example node, say Group, defined at 6.2.81.<o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/EncodingOfNodes.html#Group">http://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/EncodingOfNodes.html#Group</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Notice that this Node has a content model denoted by “ChildContentModel”. The description of this is given in 6.3.3 ChildContentModel<o:p></o:p></p><p class=MsoNormal>Reference:  <a href="http://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/EncodingOfNodes.html#ChildContentModel">http://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/EncodingOfNodes.html#ChildContentModel</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The text states: “ChildContentModel is the child-node content model corresponding to X3DChildNode, combining all profiles. ChildContentModel can contain most nodes, other Grouping nodes, Prototype declarations and ProtoInstances in any order and any combination.”. Note that there is no mention of ROUTES, or IMPORT/EXPORT.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>We should also note the text in 6.3.5 ChildContentModelSceneGraphStructure.<o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/EncodingOfNodes.html#ChildContentModelSceneGraphStructure">http://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/EncodingOfNodes.html#ChildContentModelSceneGraphStructure</a><o:p></o:p></p><p class=MsoNormal>This states “Child-node content model corresponding to SceneGraphStructure elements, which are not specific X3D nodes. These are ProtoDeclare, ExternProtoDeclare, IMPORT, EXPORT or ROUTE statements.”. This content model covers all the statements of interest. Where is it used? This content model is not listed in any  node definition. In fact, it is not mentioned anywhere else in the standard.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Turning to the XML schema V3.3 now.<o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/specifications/x3d-3.3.xsd">http://www.web3d.org/specifications/x3d-3.3.xsd</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Looking at the “Group” node, we see that the content model is derived from X3DGroupingNode. Looking at the definition for X3DGroupingNode, the following definition can be extracted:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>       </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:complexContent</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>              </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:extension</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> base</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>X3DChildNode</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                     </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:sequence</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> minOccurs</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>0</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> maxOccurs</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>unbounded</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                           </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:annotation</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                                  </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:documentation</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>children</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'></</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:documentation</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                           </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'></</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:annotation</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                           </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:group</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> ref</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>ChildContentModel</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> minOccurs</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>0</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> maxOccurs</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>unbounded</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"/></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                           </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:group</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> ref</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>ChildContentModelSceneGraphStructure</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> minOccurs</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>0</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> maxOccurs</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>unbounded</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"/></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                     </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'></</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:sequence</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                     </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:attribute</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> name</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>bboxCenter</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> type</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>SFVec3f</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> default</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>0 0 0</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"/></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>                     </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'><</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:attribute</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> name</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>bboxSize</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> type</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>boundingBoxSizeType</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"</span><span style='font-size:10.0pt;font-family:Consolas;color:red;background:white;mso-highlight:white'> default</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>="</span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>-1 -1 -1</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>"/></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>              </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'></</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:extension</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>       </span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'></</span><span style='font-size:10.0pt;font-family:Consolas;color:maroon;background:white;mso-highlight:white'>xs:complexContent</span><span style='font-size:10.0pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>></span><span style='font-size:10.0pt;font-family:Consolas;color:black;background:white;mso-highlight:white'><o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>So any node derived from X3DGroupingNode will be passed as valid of it has any of the statements we are considering. Where else if this content model used? The XML schema has six instances of this term, as follows:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><ol style='margin-top:0cm' start=1 type=1><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>In the definition of X3DGroupingNode<o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>In the definition of the content model group ChildContentModelSceneGraphStructure<o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>In the definition of the content model group GroupingNodeChildContentModel<o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>In the definition of the content model group SceneGraphFragmentWithPrototypeDeclarationsContentModel<o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>In the definition of the StaticGroup node<o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>In the definition of the GeoLOD node<o:p></o:p></li></ol><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The GroupingNodeChildContentModel is only used in the definition of the Scene element.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>So, we see that in the XML schema these statements are only permitted in grouping nodes.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Finally, let us turn to the abstract standard ISO/IEC 19775-1 V3.3. What does it tell us about the placements of statements. There is no general text covering all the statements, so we need to look at each one in turn. We will start with ROUTEs and Prototypes, 7.2.5.7 ROUTE statement, 7.2.5.8 PROTO statement, and 7.2.5.9 EXTERNPROTO statement.<o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/core.html#ROUTEStatement">http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/core.html#ROUTEStatement</a><o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/core.html#PROTOStatement">http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/core.html#PROTOStatement</a><o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/core.html#EXTERNPROTOStatement">http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/core.html#EXTERNPROTOStatement</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>All three of these clauses have the words “xxxxxx statements may appear anywhere in the file”<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Now look at 9.2.5 IMPORT statement, and 9.2.6 EXPORT statement.<o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/networking.html#IMPORTStatement">http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/networking.html#IMPORTStatement</a><o:p></o:p></p><p class=MsoNormal>Reference: <a href="http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/networking.html#EXPORTStatement">http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/networking.html#EXPORTStatement</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Neither of these clauses has any comment on the placement within the file.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>So, what do we conclude?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><ol style='margin-top:0cm' start=1 type=A><li class=MsoListParagraph style='margin-left:0cm;mso-list:l1 level1 lfo2'>ROUTEs and prototypes are permitted anywhere.<o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l1 level1 lfo2'>IMPORT and EXPORT need a statement on placement in the abstract standard<o:p></o:p></li></ol><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>If we assume that A) is correct, then:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><ol style='margin-top:0cm' start=3 type=A><li class=MsoListParagraph style='margin-left:0cm;mso-list:l1 level1 lfo2'>In the XML encoding the content models need to be amended to permit placement of these statements anywhere<o:p></o:p></li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l1 level1 lfo2'>In the Classic VRML encoding the grammar needs to be amended<o:p></o:p></li></ol><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Of course, we might want to restrict the usage, in which case these needs proper definition in the abstract standard, and propagation to the encodings.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>All the best,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Roy<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>