<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=utf-8"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Menlo;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.apple-tab-span
        {mso-style-name:apple-tab-span;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></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=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>John,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>It is an excellent question.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>So far, I have found that if I wanted to have SFNode and MFNode fields have the same content, other than  the second being an array, I have had to do separate definitions. Doing it more efficiently using a single definition is definitely worthy of further investigation. I was proposing to consider it further when I get onto the content models in my auto generation work.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Regards,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Roy<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> John Carlson [mailto:yottzumm@gmail.com] <br><b>Sent:</b> 17 April 2016 15:20<br><b>To:</b> Roy Walmsley<br><b>Cc:</b> Don Brutzman; X3D Graphics public mailing list<br><b>Subject:</b> Re: bug report X3dToJson.xslt stylesheet. Handling of SFNode as parameter to Proto<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Why wouldn’t you want to create allNodes from oneNode, so allNodes is just an array of oneNode?<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Pardon my ignorance.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>John<o:p></o:p></p><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal>On Apr 17, 2016, at 10:01 AM, Roy Walmsley <<a href="mailto:roy.walmsley@ntlworld.com">roy.walmsley@ntlworld.com</a>> wrote:<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>John,</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>At the moment my hand crafted schema permits three properties for fieldValue:</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div style='margin-left:36.0pt'><p class=MsoNormal style='text-indent:-18.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>1)</span><span style='font-size:7.0pt;color:#1F497D'>     <span class=apple-converted-space> </span></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>@name</span><o:p></o:p></p></div><div style='margin-left:36.0pt'><p class=MsoNormal style='text-indent:-18.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>2)</span><span style='font-size:7.0pt;color:#1F497D'>     <span class=apple-converted-space> </span></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>@value</span><o:p></o:p></p></div><div style='margin-left:36.0pt'><p class=MsoNormal style='text-indent:-18.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>3)</span><span style='font-size:7.0pt;color:#1F497D'>     <span class=apple-converted-space> </span></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-children</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>There is no restriction that if there is an “@value” there must  not be a “-children”.</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>No, I can see your point if that the user declared field is an SFNode type then it ought to accept a single child. So, perhaps the property would be named “-child”.</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Let’s assume, for the sake of argument, that we agree to permit four properties as follows:</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div style='margin-left:36.0pt'><p class=MsoNormal style='text-indent:-18.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>1)</span><span style='font-size:7.0pt;color:#1F497D'>     <span class=apple-converted-space> </span></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>@name</span><o:p></o:p></p></div><div style='margin-left:36.0pt'><p class=MsoNormal style='text-indent:-18.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>2)</span><span style='font-size:7.0pt;color:#1F497D'>     <span class=apple-converted-space> </span></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>@value</span><o:p></o:p></p></div><div style='margin-left:36.0pt'><p class=MsoNormal style='text-indent:-18.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>3)</span><span style='font-size:7.0pt;color:#1F497D'>     <span class=apple-converted-space> </span></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-child</span><o:p></o:p></p></div><div style='margin-left:36.0pt'><p class=MsoNormal style='text-indent:-18.0pt'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>4)</span><span style='font-size:7.0pt;color:#1F497D'>     <span class=apple-converted-space> </span></span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-children</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>It would be reasonable to make the “@name” property required, since we always need it.</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>As for the other three, only one of the three must occur.</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If we have a “@value” property it must be either boolean, numeric, integer, or string, or else an array of one of these types. So perhaps for the time being it is easier to leave it as “any”.</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If we have “-child” then it must be an object, that is, a single node. And it can be any node. This would need a new definition, e.g. “-oneNode”</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>If we have “-children” then it must be an array of nodes. This is my existing “-allNodes” definition.<span class=apple-converted-space> </span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>However, it may have to be done along the following lines, illustrated by modifying my current design:</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>       <span class=apple-converted-space> </span><span style='color:maroon'>"fieldValue"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>           <span class=apple-converted-space> </span><span style='color:maroon'>"type"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span>"array"<span style='color:blue'>,</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>           <span class=apple-converted-space> </span><span style='color:maroon'>"minItems"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:teal'>1</span><span style='color:blue'>,</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>           <span class=apple-converted-space> </span><span style='color:maroon'>"items"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>               <span class=apple-converted-space> </span><span style='color:maroon'>"additionalProperties"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:teal'>false</span><span style='color:blue'>,</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>               <span class=apple-converted-space> </span><span style='color:maroon'>"oneOf"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>[</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                   <span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"type"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span>"object"<span style='color:blue'>,</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"properties"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                           <span class=apple-converted-space> </span><span style='color:maroon'>"@name"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                               <span class=apple-converted-space> </span><span style='color:maroon'>"type"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span>"string"</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                            <span style='color:blue'>},</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                           <span class=apple-converted-space> </span><span style='color:maroon'>"@value"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{}</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:blue'>},</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"required"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>[</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                            "@name"<span style='color:blue'>,</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                            "@value"</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:blue'>],</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"additionalProperties"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:teal'>false</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                   <span class=apple-converted-space> </span><span style='color:blue'>},</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                   <span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"type"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span>"object"<span style='color:blue'>,</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"properties"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                           <span class=apple-converted-space> </span><span style='color:maroon'>"@name"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                               <span class=apple-converted-space> </span><span style='color:maroon'>"type"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span>"string"</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                           <span class=apple-converted-space> </span><span style='color:blue'>},</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                           <span class=apple-converted-space> </span><span style='color:maroon'>"-children"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>{</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                               <span class=apple-converted-space> </span><span style='color:maroon'>"$ref"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span>"#/definitions/-allNodes"</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                           <span class=apple-converted-space> </span><span style='color:blue'>}</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:blue'>},</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"required"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:blue'>[</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                            "@name"<span style='color:blue'>,</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                            "-children"</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:blue'>],</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                       <span class=apple-converted-space> </span><span style='color:maroon'>"additionalProperties"</span><span style='color:blue'>:</span><span class=apple-converted-space> </span><span style='color:teal'>false</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>                   <span class=apple-converted-space> </span><span style='color:blue'>}</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>               <span class=apple-converted-space> </span><span style='color:blue'>]</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>           <span class=apple-converted-space> </span><span style='color:blue'>}</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";background:white'>       <span class=apple-converted-space> </span><span style='color:blue'>},</span></span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Appended is a graphic representation of this.</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Regards,</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Roy</span><o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p></div><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><div><p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span class=apple-converted-space><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> </span></span><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>John Carlson [<a href="mailto:yottzumm@gmail.com">mailto:yottzumm@gmail.com</a>]<span class=apple-converted-space> </span><br><b>Sent:</b><span class=apple-converted-space> </span>17 April 2016 04:09<br><b>To:</b><span class=apple-converted-space> </span>Don Brutzman; Roy Walmsley<br><b>Cc:</b><span class=apple-converted-space> </span>X3D Graphics public mailing list<br><b>Subject:</b><span class=apple-converted-space> </span>Re: bug report X3dToJson.xslt stylesheet. Handling of SFNode as parameter to Proto</span><o:p></o:p></p></div></div></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Well the stylesheet isn’t fixed yet.  Here’s the diff to the stylesheet output that makes my prototype expander code work:<o:p></o:p></p></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><div><p class=MsoNormal><b><span style='font-size:8.5pt;font-family:"Menlo","serif"'>diff --git a/rubikOnFire.json b/rubikOnFire.json</span></b><o:p></o:p></p></div></div><div><div><p class=MsoNormal><b><span style='font-size:8.5pt;font-family:"Menlo","serif"'>index 7242909..c8120f3 100644</span></b><o:p></o:p></p></div></div><div><div><p class=MsoNormal><b><span style='font-size:8.5pt;font-family:"Menlo","serif"'>--- a/rubikOnFire.json</span></b><o:p></o:p></p></div></div><div><div><p class=MsoNormal><b><span style='font-size:8.5pt;font-family:"Menlo","serif"'>+++ b/rubikOnFire.json</span></b><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif";color:#34BBC7'>@@ -397,13 +397,12 @@</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                 },</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                 {</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                   "@name":"myShape",</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif";color:#C33720'>-                  "-children":[</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif";color:#34BD26'>+                  "-children":</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                     { "Box":</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                       {</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                         "@size":[1,1,1]</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                       }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                     }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif";color:#C33720'>-                  ]</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                 }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>               ]</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>             }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>Submitted for your consideration.  I can always had modify code (and so can everyone else???)  -value doesn’t work for me, because it doesn’t pass schema. Using an object doesn’t work in schema.   So I will look at that next.<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><p class=MsoNormal>John<o:p></o:p></p></div></div><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><p class=MsoNormal>On Apr 16, 2016, at 10:42 PM, John Carlson <<a href="mailto:yottzumm@gmail.com"><span style='color:purple'>yottzumm@gmail.com</span></a>> wrote:<o:p></o:p></p></div></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><div><div><p class=MsoNormal>I take that back.  Here’s what I’d like to do…I’d like -children to support both an object (SFNode) and an array (MFNode), so syntax like this<o:p></o:p></p></div><div><div><p class=MsoNormal>is acceptable:<o:p></o:p></p></div></div><div><div><p class=MsoNormal> <o:p></o:p></p></div></div><div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>         { "ProtoInstance":</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>            {</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>              "@name":"twentyseven",</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>              "fieldValue": [</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                {</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                  "@name":"ttranslation",</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                  "@value":[0,0,0]</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                },</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                {</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                  "@name":"myShape",</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                  "-children": {</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                    "Box": {</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                      "@size":[1,1,1]</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                    }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                  }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>                }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>              ]</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>            }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><span style='font-size:8.5pt;font-family:"Menlo","serif"'>          }</span><o:p></o:p></p></div></div><div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div></div><div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div></div><div><div><p class=MsoNormal>Thus, if you have an SFNode, it will will generate syntax like the above for -children, and if you have an MFNode, the stylesheet will generate an array for -children.  And then the schema will either accept an array or an object.<o:p></o:p></p></div></div><div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div></div><div><div><p class=MsoNormal>Is this possible?  I will test to see if the stylesheet is already fixed.<o:p></o:p></p></div></div><div><div><p class=MsoNormal><br><br><br><o:p></o:p></p></div></div><div><div><p class=MsoNormal>John<o:p></o:p></p></div></div><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div><p class=MsoNormal>On Apr 16, 2016, at 10:28 PM, John Carlson <<a href="mailto:yottzumm@gmail.com"><span style='color:purple'>yottzumm@gmail.com</span></a>> wrote:<o:p></o:p></p></div></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><div><div><p class=MsoNormal>I have verified that using -children solves my problem (at least with schema!).<br><br>Thanks,<br><br>John<br><br><br><o:p></o:p></p></div><div><p class=MsoNormal>On Apr 3, 2016, at 12:26 PM, Don Brutzman <<a href="mailto:brutzman@nps.edu"><span style='color:purple'>brutzman@nps.edu</span></a>> wrote:<br><br>Apologies for delayed reply.<br><br>Here is the rule that was decided as most straightforward and consistent (currently last bullet under Completed Work):<br><br><a href="http://www.web3d.org/x3d/stylesheets/X3dToJson.html#Issues"><span style='color:purple'>http://www.web3d.org/x3d/stylesheets/X3dToJson.html#Issues</span></a><br><br>* field and fieldValue statements containing SFNode/MFNode content use the -children key.<br><br>Your scene passes all X3D Validator tests (good job there) and I think the relevant excerpts that you are referring to are<br><br>=================================================================<br>...<br><ProtoDeclare name='twentyseven'><br><ProtoInterface><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span><field accessType='inputOutput' name='ttranslation' type='SFVec3f' value='0.0 0.0 0.0'/><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span><field accessType='inputOutput' name='myShape' type='SFNode'><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> <Sphere/><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span></field><br></ProtoInterface><br><ProtoBody><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span><Transform translation='0 0 0'><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> <IS><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span><connect nodeField='translation' protoField='ttranslation'/><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> </IS><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> <ProtoInstance name='nine'><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span><fieldValue name='ztranslation' value='0 0 0'/><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span><IS><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span> <connect nodeField='myShape' protoField='myShape'/><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span></IS><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> </ProtoInstance><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> <ProtoInstance name='nine'><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span><fieldValue name='ztranslation' value='0 0 2'/><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span><IS><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span> <connect nodeField='myShape' protoField='myShape'/><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span></IS><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> </ProtoInstance><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> <ProtoInstance name='nine'><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span><fieldValue name='ztranslation' value='0 0 -2'/><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span><IS><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span> <connect nodeField='myShape' protoField='myShape'/><br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span></IS><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> </ProtoInstance><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span></Transform><br></ProtoBody><br></ProtoDeclare><br><ProtoInstance name='twentyseven'><br><fieldValue name='ttranslation' value='0 0 0'/><br><fieldValue name='myShape'><br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span><Box size='1 1 1'/><br></fieldValue><br></ProtoInstance><br>=================================================================<br><br>So the corresponding conversion of the ProtoInstance to JSON would be<br><br>{ "ProtoInstance":<br>{<br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span>"@name":"twentyseven",<br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span>"fieldValue": [<br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> {<br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span>"@name":"ttranslation",<br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span>"@value":[0,0,0]<br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> },<br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> {<br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span>"@name":"myShape",<br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span>"-children":[<br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span> { "Box":<br><span class=apple-tab-span>                                   </span><span class=apple-converted-space> </span>{<br><span class=apple-tab-span>                                   </span><span class=apple-converted-space> </span> "@size":[1,1,1]<br><span class=apple-tab-span>                                   </span><span class=apple-converted-space> </span>}<br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span> }<br><span class=apple-tab-span>                       </span><span class=apple-converted-space> </span>]<br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span> }<br><span class=apple-tab-span>           </span><span class=apple-converted-space> </span>]<br>}<br>}<br><br>This JSON excerpt above matches the ProtoInstance in "rubikOnFireFlawed.json" file you sent a week ago.<br><br>Full result from X3dToJson.xslt stylesheet attached, passes jslint and also passes Roy's X3D JSON Schema validation.<br><br>Incidentally, nested prototypes are certainly allowed by X3D Specification but the great majority of my testing to date has not been testing nesting.<br><br><br>On 3/25/2016 11:35 PM, John Carlson wrote:<br><br><br><o:p></o:p></p></div><div><p class=MsoNormal>So it actually caught it after my PrototypeExpander ran on it.  So there may be a bug with how my PrototypeExpander handles -children which are SFNodes (actually they are MFNodes (arrays) in the JSON code, so I think the JSON is wrong).  You guys may have discussed this, or something like it, and I was ignorant at the time.<br><br>John<br><br><br><o:p></o:p></p></div><div><p class=MsoNormal>On Mar 26, 2016, at 2:28 AM, John Carlson <<a href="mailto:yottzumm@gmail.com"><span style='color:purple'>yottzumm@gmail.com</span></a>> wrote:<br><br>If you pass an SFNode to a Proto, it is treated as an MFNode and given -children, and not -value or -child.  This can create -geometry nodes which are arrays instead of objects.  Here are an X3D example, the converted JSON, and how the JSON should appear (hand edited).  I did not pick -value or -child because I forgot what we chose.  I could probably fix this another way, but i think -children is misleading when it’s an SFNode.<rubikOnFire.json><rubikOnFire.x3d><rubikOnFireFixed.json>You may use my X3D file in your X3D resources examples if you wish.  rubikOnFire.json  does not pass schema. If there’s a problem with my X3D file, then we should fix QA, because it passed the latest X3D-Edit tests. (Perhaps there should be a warning?).  If there is a problem with my X3D file, then JSON should not be produced.<br><br>So take your pick, fix the stylesheet, or find an error in my X3D file.   Good luck with both.<br><br>There’s likely more bugs to report.  This is just the first one.  Good catch Roy!<br><br>Thanks,<br><br>John<o:p></o:p></p></div><div><p class=MsoNormal><br>all the best, Don<br>--<span class=apple-converted-space> </span><br>Don Brutzman  Naval Postgraduate School, Code USW/Br       <a href="mailto:brutzman@nps.edu"><span style='color:purple'>brutzman@nps.edu</span></a><br>Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   +1.831.656.2149<br>X3D graphics, virtual worlds, navy robotics<span class=apple-converted-space> </span><a href="http://faculty.nps.edu/brutzman"><span style='color:purple'>http://faculty.nps.edu/brutzman</span></a><br><rubikOnFire.json><o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div></div></div></blockquote></div><div><p class=MsoNormal> <o:p></o:p></p></div></div></div></div></blockquote></div><div><p class=MsoNormal> <o:p></o:p></p></div></div><p class=MsoNormal><JSON Schema fieldValue definition.png><o:p></o:p></p></div></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>