[x3d-public] X3D Object Model development, Java SAI implementation efforts
Don Brutzman
brutzman at nps.edu
Fri Sep 9 19:34:22 PDT 2016
summary: logic tracing and debugging via email, a tricky issue yields.
updates checked in. results:
http://www.web3d.org/specifications/java/javadoc
http://www.web3d.org/specifications/X3DObjectModel-3.3.xml
troubleshooting log follows for anyone interested in XML XPATH XSLT programming.
============================================================================================
On 9/8/2016 11:45 PM, Don Brutzman wrote:
> [...]
> p.s.Noted a gap in X3D Object Model production: X3DViewpoint seems to be overlooked, perhaps others as well.
Looked into this further, Roy.
X3D object model does include
<AbstractNodeType name="X3DViewpointNode"> ...
which include all expected <field> declarations from XML schema definition
<xs:complexType name="X3DViewpointNode" abstract="true"> ...
_except for_ schema definition of
<xs:attribute name="description" type="SFString"> ...
Not sure why this is getting excluded.
Looking at stylesheet BuildObjectModelXmlFile.xslt stylesheet, it appears that the relevant construct is within the block starting on line 195
<xsl:element name="AbstractNodeTypes">
as part of the multi-line xpath selection, starting on line 252,
<xsl:variable name="nonNodeFieldList" select="
//xs:schema/xs:complexType[@name=$greatGrandParentNodeType]/xs:attribute
| //xs:schema/xs:complexType[@name=$greatGrandParentNodeType]/xs:annotation/xs:appinfo/xs:attribute
| //xs:schema/xs:complexType[@name=$greatGrandParentNodeType]/xs:complexContent/xs:extension/xs:attribute
| //xs:schema/xs:complexType[@name=$grandParentNodeType]/xs:attribute
| //xs:schema/xs:complexType[@name=$grandParentNodeType]/xs:annotation/xs:appinfo/xs:attribute
| //xs:schema/xs:complexType[@name=$grandParentNodeType]/xs:complexContent/xs:extension/xs:attribute
| //xs:schema/xs:complexType[@name=$parentNodeType]/xs:attribute
| //xs:schema/xs:complexType[@name=$parentNodeType]/xs:annotation/xs:appinfo/xs:attribute
| //xs:schema/xs:complexType[@name=$parentNodeType]/xs:complexContent/xs:extension/xs:attribute
| //xs:schema/xs:complexType[@name=$baseType]/xs:attribute
| //xs:schema/xs:complexType[@name=$baseType]/xs:annotation/xs:appinfo/xs:attribute
| //xs:schema/xs:complexType[@name=$baseType]/xs:complexContent/xs:extension/xs:attribute
| xs:complexContent/xs:extension/xs:attribute
| xs:annotation/xs:appinfo/xs:attribute
| xs:complexType/xs:attribute
| xs:attribute"/>
Despite the description attribute not being grabbed from the schema, sibling definitions for jump orientation andretainUserOffsets are captured OK.
Presumable the OK attributes are getting caught by line 265 above
| xs:complexContent/xs:extension/xs:attribute
I used the following diagnostic to confirm that it was getting caught:
<xsl:for-each select="$allFieldList">
<xsl:sort select="lower-case(@name)"/>
<!-- debug diagnostic -->
<xsl:if test="($abstractNodeName='X3DViewpointNode') and (@name='description')">
<xsl:message>
<xsl:text>*** Found X3DViewpointNode description in XML schema...</xsl:text>
</xsl:message>
</xsl:if>
<xsl:call-template name="doField">
<xsl:with-param name="containerName" select="$abstractNodeName"/>
</xsl:call-template>
</xsl:for-each>
which confirmed it was found successfully.
Now moving deeper, into your "doField" template, a similar debug statement at the top of the template found that the attribute indeed arrived there OK, as expected.
<!-- debug -->
<xsl:if test="(ancestor::*[@name='X3DViewpointNode'] and (@name='description'))">
<xsl:message>
<xsl:text>*** Found X3DViewpointNode description in doField template...</xsl:text>
</xsl:message>
</xsl:if>
Now pressing on to discover why it got lost.
You have the following xsl:if statement to filter duplicates:
<xsl:if test="(parent::xs:appinfo) or (not(parent::xs:appinfo) and not(../../../..//xs:annotation/xs:appinfo/xs:attribute[@name = $fieldName]))">
Hmmm. I think what is happening is that the ../../../../ is reaching too high, then finding another independent element somewhere else with a 'description' attribute, and thus mistakenly rejecting it. Ouch.
btw have grown wary of ../../../.. kinds of constructs with XML schema, because the relative hierarchies sometimes have a different number of levels. Instead am now trying to use ancestor:: to get to the appropriate upper level, seems to be a more reliable xpath construct for this kind of thing.
so, with a little trial and error, got to the following replacement for ../../../.. to carefully exclude both cases of interest.
<xsl:if test="(parent::xs:appinfo) or (not(parent::xs:appinfo) and
not(ancestor::xs:complexType//xs:annotation/xs:appinfo/xs:attribute[@name = $fieldName]) and
not( ancestor::xs:element//xs:annotation/xs:appinfo/xs:attribute[@name = $fieldName]))">
boom presto, that worked! a few dozen previously overlooked fields have appeared in the X3D Object Model.
once again, am also really liking the fact that changes to object model are checked into version control. A diff quickly reveals that only additions have occurred and no removals.
looked at them all closely. As hoped for, the following appeared under X3DViewpointNode and corresponding *Viewpoint nodes:
<field type="SFString" accessType="inputOutput" name="description">
<componentInfo name="Navigation" level="2"/>
</field>
Rebuilding the Java SAI from object model XML is again a strong test: some further rough edges were detected and corrected.
i left the XSLT debug diagnostic blocks in place, commented out, for potential future use.
all checked in and uploaded. another step forward. 8)
all the best, Don
--
Don Brutzman Naval Postgraduate School, Code USW/Br brutzman at nps.edu
Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149
X3D graphics, virtual worlds, navy robotics http://faculty.nps.edu/brutzman
More information about the x3d-public
mailing list