[x3d-public] X3DJSAIL still broken! XML actually. Potential Fix to XSLT
John Carlson
yottzumm at gmail.com
Thu Jul 1 14:20:19 PDT 2021
TypeError: this._cf.back.node is null appears to be a problem with the
new ComposedCubeMapTexture synonyms/containerFields and X3DOM.
Patched JSON, below. Looks good? Will do an XML patch in next message.
$ git diff ball.new.json
diff --git a/src/main/data/ball.new.json b/src/main/data/ball.new.json
index df9a84b00..d7b4e065a 100644
--- a/src/main/data/ball.new.json
+++ b/src/main/data/ball.new.json
@@ -71,7 +71,7 @@
},
{
"@name":"translated",
- "@content":"30 June 2021"
+ "@content":"01 July 2021"
},
{
"@name":"generator",
@@ -268,26 +268,31 @@
"@url":["../resources/images/all_probes/stpeters_cross/stpeters_back.png","https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_back.png"]
}
},
+ "-bottomTexture":
{ "ImageTexture":
{
"@url":["../resources/images/all_probes/stpeters_cross/stpeters_bottom.png","https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_bottom.png"]
}
},
+ "-frontTexture":
{ "ImageTexture":
{
"@url":["../resources/images/all_probes/stpeters_cross/stpeters_front.png","https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_front.png"]
}
},
+ "-leftTexture":
{ "ImageTexture":
{
"@url":["../resources/images/all_probes/stpeters_cross/stpeters_left.png","https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_left.png"]
}
},
+ "-rightTexture":
{ "ImageTexture":
{
"@url":["../resources/images/all_probes/stpeters_cross/stpeters_right.png","https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_right.png"]
}
},
+ "-topTexture":
{ "ImageTexture":
{
"@url":["../resources/images/all_probes/stpeters_cross/stpeters_top.png","https://coderextreme.net/X3DJSONLD/images/all_probes/stpeters_cross/stpeters_top.png"]
On 7/1/21 4:06 PM, John Carlson wrote:
> Clarification below:
>
> On 7/1/21 3:29 PM, John Carlson wrote:
>
>> Actually, I believe *XML* export is failing from X3DJSAIL. XML
>> output causes the X3dToJson.xslt to produce bad results.
>>
>> See below code.
>>
>> See pretty printed code attached from X3DJSAIL export. Search for
>> multiple versions of backTexture causing the JSON generation to get
>> messed up.
>>
>> Perhaps we should add a schematron hint for when backTexture, etc. is
>> repeated in a ComposedCubeMapTexture?
>>
>> Java looks fine. Your Java looks good too.
>
>
> That is, both versions of ball.java look good. These aren't produced
> by X3DJSAIL, rather I generated them with my serializer and your
> X3dToJava.xslt, with my RunSaxon.java
>
>
> Sorry I didn't make that clear before.
>
>
> To fix, I suggest, using this template:
>
> if (hasAncestorX3D() &&
> findAncestorX3D().getVersion().startsWith("3"))
> correctedContainerField = "back";
> else correctedContainerField = "backTexture";
>
> and replace back 1 and back 2 with appropriate sides of cube. Then
> sprinkle the filled in templates in the code below.
>
> I fully realize you want an XSLT patch. Here's a potential patch. I
> will test against ball.x3d, but you'll have to test the other cases.
> I'm not sure why you put in the commented out code.
>
>
> $ svn diff CreateX3dSceneAccessInterfaceJava.xslt
> Index: CreateX3dSceneAccessInterfaceJava.xslt
> ===================================================================
> --- CreateX3dSceneAccessInterfaceJava.xslt (revision 32276)
> +++ CreateX3dSceneAccessInterfaceJava.xslt (working copy)
> @@ -12960,13 +12960,13 @@
> <xsl:text>
> String correctedContainerField;</xsl:text>
> <xsl:for-each
> select="InterfaceDefinition/field[string-length(@synonym) > 0][@type =
> 'SFNode']">
> - <xsl:if test="(position() = 1)">
> + <!--xsl:if test="(position() = 1)"-->
> <xsl:text disable-output-escaping="yes"><![CDATA[
> if (hasAncestorX3D() &&
> findAncestorX3D().getVersion().startsWith("3"))
> correctedContainerField = "]]></xsl:text><xsl:value-of
> select="@synonym"/><xsl:text>";
> else correctedContainerField = "</xsl:text> <xsl:value-of
> select="@name"/><xsl:text>";
> </xsl:text>
> - </xsl:if>
> + <!--/xsl:if-->
> <xsl:variable name="CamelCaseName"><!-- upper camel
> case -->
> <xsl:value-of
> select="translate(substring(@name,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
> <xsl:value-of select="substring(@name,2)"/>
>
>
> TTYS.
>
> John
>
>
>>
>> x3d/stylesheets/java/src/org/web3d/x3d/jsail/CubeMapTexturing/ComposedCubeMapTexture.java
>>
>>> /**
>>> * Utility method to adjust field synonyms
>>> * @see <a
>>> href="https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#fieldNameChanges">X3D
>>>
>>> Scene Authoring Hints: X3D4 Field name changes for improved
>>> consistency</a>
>>> */
>>> private void handleFieldSynonyms()
>>> {
>>> String correctedContainerField;
>>> if (hasAncestorX3D() &&
>>> findAncestorX3D().getVersion().startsWith("3"))
>>> correctedContainerField = "back";
>>> else correctedContainerField = "backTexture";
>>>
>>> if (getBackTexture() != null)
>>> ((X3DConcreteNode)
>>> getBackTexture()).setContainerFieldOverride(correctedContainerField);
>>> else if (getBackTextureProtoInstance() != null)
>>> ((X3DConcreteNode)
>>> getBackTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);
>>>
>>>
>>> if (getBottomTexture() != null)
>>> ((X3DConcreteNode)
>>> getBottomTexture()).setContainerFieldOverride(correctedContainerField);
>>> else if (getBottomTextureProtoInstance() != null)
>>> ((X3DConcreteNode)
>>> getBottomTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);
>>>
>>>
>>> if (getFrontTexture() != null)
>>> ((X3DConcreteNode)
>>> getFrontTexture()).setContainerFieldOverride(correctedContainerField);
>>> else if (getFrontTextureProtoInstance() != null)
>>> ((X3DConcreteNode)
>>> getFrontTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);
>>>
>>>
>>> if (getLeftTexture() != null)
>>> ((X3DConcreteNode)
>>> getLeftTexture()).setContainerFieldOverride(correctedContainerField);
>>> else if (getLeftTextureProtoInstance() != null)
>>> ((X3DConcreteNode)
>>> getLeftTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);
>>>
>>>
>>> if (getRightTexture() != null)
>>> ((X3DConcreteNode)
>>> getRightTexture()).setContainerFieldOverride(correctedContainerField);
>>> else if (getRightTextureProtoInstance() != null)
>>> ((X3DConcreteNode)
>>> getRightTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);
>>>
>>>
>>> if (getTopTexture() != null)
>>> ((X3DConcreteNode)
>>> getTopTexture()).setContainerFieldOverride(correctedContainerField);
>>> else if (getTopTextureProtoInstance() != null)
>>> ((X3DConcreteNode)
>>> getTopTextureProtoInstance()).setContainerFieldOverride(correctedContainerField);
>>>
>>> }
More information about the x3d-public
mailing list