media @ VU
[]
readme
course
preface
I
1
2
II
3
4
III
5
6
7
IV
8
9
10
V
11
12
afterthoughts
appendix
references
examples
resources
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:saxon="http://icl.com/saxon" saxon:trace="no">
<!-- XSL namespaces are in transition! Tools are slow to catch up.
*** Edit the topmost stylesheet tag on line 2 of this file to match the xmlns namespace URI for your XSL tool. ***
W3C:
Saxon: <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
IBM XSLEditor: <xsl:stylesheet xmlns:xsl='http://www.w3.org/XSL/Transform/1.0'>
IE 5: <xsl:stylesheet xmlns:xsl='http://www.w3.org/TR/WD-xsl'>
XT: <xsl:stylesheet xmlns:xsl='http://www.w3.org/XSL/Transform'>
-->
<!--
<head>
<meta name="filename" content="X3dToHtml.xsl" />
<meta name="author" content="Don Brutzman" />
<meta name="revised" content="26 January 2002" />
<meta name="description" content="XSL stylesheet to convert X3D source into an easily readable HTML page." />
<meta name="url" content="http://www.web3D.org/TaskGroups/x3d/translation/X3dToHtml.xsl" />
</head>
Recommended tool:
SAXON XML Toolkit (and Instant Saxon) from Michael Kay of ICL, saxon.sourceforge.net
Can also be used with Apache server
-->
<!-- Problems and bugs:
- autocorrection of String, array field delimiters in ProtoInstances (GeoVrmlExample1)
-->
<xsl:strip-space elements="*" />
<xsl:output method="text" encoding="utf-8" media-type="text/html" indent="yes" cdata-section-elements="Script"/>
<!-- omit-xml-declaration="no" -->
<!-- ****** root: start of file ****** -->
<xsl:template match="/">
<!-- <xsl:text><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "www.w3.org/TR/REC-html40/strict.dtd&quot;> </xsl:text> -->
<xsl:text><html> </xsl:text>
<xsl:text><head> </xsl:text>
<xsl:text><title></xsl:text>
<xsl:variable name="fileName" select="//head/meta[@name='filename']/@content" />
<xsl:choose>
<xsl:when test="fileName!='*enter filename here*' ">
<xsl:value-of select="//head/meta[@name='filename']/@content"/>
<xsl:text> (X3dToHtml)</xsl:text>
</xsl:when>
<xsl:otherwise><xsl:text> X3dToHtml </xsl:text></xsl:otherwise>
</xsl:choose>
<xsl:text></title> </xsl:text>
<xsl:text><meta name="generator" content="X3dToHtml.xsl, www.web3D.org/TaskGroups/x3d/translation/X3dToHtml.xsl&quot;> </xsl:text>
<xsl:text></head> </xsl:text>
<xsl:text><body> </xsl:text>
<xsl:text><pre> </xsl:text>
<xsl:text>&lt;?xml version="1.0" encoding="UTF-8"?&gt; </xsl:text>
<xsl:variable name="wrapped" select="//*[local-name()='appearance' or
local-name()='children' or local-name()='choice' or
local-name()='color' or local-name()='coord' or local-name()='fontStyle' or
local-name()='geometry' or local-name()='material' or local-name()='normal' or
local-name()='source' or local-name()='level' or local-name()='texCoord' or
local-name()='texture' or local-name()='textureTransform']" />
<xsl:choose>
<xsl:when test="
<xsl:text>&lt;!DOCTYPE X3D PUBLIC "http://www.web3D.org/TaskGroups/x3d/translation/x3d-compromise.dtd" </xsl:text>
<!-- (no longer used in local doctype) file://localhost/C: -->
<xsl:text> "/www.web3D.org/TaskGroups/x3d/translation/x3d-compromise.dtd"&gt; </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>&lt;!DOCTYPE X3D PUBLIC "http://www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd" </xsl:text>
<xsl:text> "/www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd"&gt; </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text></pre> </xsl:text>
<xsl:apply-templates/>
<xsl:text> <p> </xsl:text>
<xsl:text> &lt;!-- Tag color codes: </xsl:text>
<xsl:if test="wrapped">
<xsl:text><font color="BLUE"> &lt;field&gt;</font> </xsl:text>
</xsl:if>
<xsl:text> </xsl:text>
<xsl:text>&lt;<font color="NAVY">NodeType</font></xsl:text>
<xsl:text><font color="GREEN"> DEF</font>='</xsl:text>
<xsl:text><font color="BROWN">NodeName</font>' </xsl:text>
<xsl:text><font color="GREEN"> attribute</font>='</xsl:text>
<xsl:text><font color="TEAL">value</font>'/&gt;</xsl:text>
<xsl:text> </xsl:text>
<xsl:if test="
<xsl:text><font color="BLUE"> &lt;/field&gt;</font></xsl:text>
</xsl:if>
<xsl:if test="//*[contains(local-name(),'Proto')]">
<xsl:text> </xsl:text>
<xsl:text>&lt;<font color="PURPLE"> Prototype </font></xsl:text>
<xsl:text><font color="GREEN"> name</font>='</xsl:text>
<xsl:text><font color="PURPLE">ProtoName</font>'/&gt; </xsl:text>
</xsl:if>
<xsl:if test="//*[starts-with(local-name(),'field')]">
<xsl:text> </xsl:text>
<xsl:text>&lt;<font color="NAVY"> field </font></xsl:text>
<xsl:text><font color="GREEN"> name</font>='</xsl:text>
<xsl:text><font color="PURPLE">fieldName</font>'/&gt; </xsl:text>
</xsl:if>
<xsl:text> --&gt; </xsl:text>
<xsl:text> </p> </xsl:text>
<xsl:text></body> </xsl:text>
<xsl:text></html> </xsl:text>
</xsl:template>
<!-- ****** recurse through each of the tree node elements ****** -->
<xsl:template match="*">
<xsl:if test="local-name(..)='Script' and local-name()='field'"><xsl:text> </xsl:text></xsl:if>
<!-- first tag name -->
<xsl:choose>
<xsl:when test="local-name()='ROUTE'">
<xsl:text>&lt;<font color="RED"></xsl:text>
</xsl:when>
<xsl:when test="local-name()='ProtoDeclare' or local-name()='ExternProtoDeclare' or local-name()='ProtoInstance'">
<xsl:text>&lt;<font color="PURPLE"></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>&lt;<font color="NAVY"></xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="local-name()"/>
<xsl:text></font></xsl:text>
<!-- next attributes, if any. output in order if appropriate. -->
<xsl:if test="@*">
<xsl:choose>
<xsl:when test="local-name()='component'">
<xsl:apply-templates select="@name"/>
<xsl:apply-templates select="@*[local-name()!='name']"/>
</xsl:when>
<xsl:when test="local-name()='meta'">
<xsl:apply-templates select="@name"/>
<xsl:apply-templates select="@content"/>
<xsl:apply-templates select="@*[local-name()!='name' and local-name()!='content']"/>
</xsl:when>
<xsl:when test="local-name()='ROUTE'">
<xsl:apply-templates select="@fromNode"/>
<xsl:apply-templates select="@fromField"/>
<xsl:apply-templates select="@toNode"/>
<xsl:apply-templates select="@toField"/>
</xsl:when>
<xsl:when test="local-name()='ElevationGrid' or local-name()='GeoElevationGrid'">
<xsl:apply-templates select="@*[local-name()!='height' and local-name()!='colorIndex']"/>
<xsl:apply-templates select="@height"/>
<xsl:apply-templates select="@colorIndex"/>
</xsl:when>
<xsl:when test="local-name()='IndexedFaceSet'">
<xsl:apply-templates select="@*[not(contains(local-name(), 'Index'))]"/>
<xsl:apply-templates select="@*[contains(local-name(), 'Index')]"/>
</xsl:when>
<xsl:when test="contains(local-name(),'Proto')">
<xsl:apply-templates select="@DEF"/>
<xsl:apply-templates select="@name"/>
<xsl:apply-templates select="@*[(local-name()!='DEF') and (local-name()!='name')]"/>
</xsl:when>
<xsl:when test="local-name()='field' or local-name()='fieldValue'">
<xsl:apply-templates select="@name"/>
<xsl:apply-templates select="@type"/>
<xsl:apply-templates select="@value"/>
<xsl:apply-templates select="@*[(local-name()!='name') and (local-name()!='type') and (local-name()!='value') and (local-name()!='appInfo') and (local-name()!='documentation')]"/>
<xsl:apply-templates select="@appInfo"/>
<xsl:apply-templates select="@documentation"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@DEF | @USE | @*[not(contains(local-name(), 'url') or contains(local-name(), 'Url'))]"/>
<xsl:apply-templates select="@*[contains(local-name(), 'url') or contains(local-name(), 'Url')]"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<!-- appropriate angle-bracket close of first tag, depending if children node/comment is present -->
<xsl:choose>
<xsl:when test="node() | comment()"><xsl:text>&gt; <blockquote></xsl:text></xsl:when>
<xsl:when test="local-name(..)='Script' and local-name()='field'"><xsl:text>/&gt;</xsl:text></xsl:when>
<xsl:otherwise><xsl:text>/&gt; </xsl:text></xsl:otherwise>
</xsl:choose>
<!-- recurse on contained tag/comment -->
<xsl:apply-templates select="node() | comment()"/>
<!-- add a closing tag if children node/comment is present -->
<xsl:if test="* or comment()">
<xsl:choose>
<xsl:when test="local-name()='ProtoDeclare' or local-name()='ExternProtoDeclare' or local-name()='ProtoInstance'">
<xsl:text></blockquote> &lt;/<font color="PURPLE"></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text></blockquote> &lt;/<font color="NAVY"></xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="local-name()"/>
<xsl:text></font>&gt; </xsl:text>
</xsl:if>
<!-- *** need test for last -->
<xsl:text><br> </xsl:text>
</xsl:template>
<!-- ****** recurse through each of the attributes ****** -->
<xsl:template match="@*">
<!-- eliminate default attribute values, otherwise they will all appear in output -->
<!-- this block is used identically in X3dToVrml97.xsl X3dToHtml.xsl X3dUnwrap.xsl and X3dWrap.xsl -->
<!-- check values with/without .0 suffix since these are string checks and autogenerated/DOM output might have either -->
<!-- do not check ProtoInstances or natively defined nodes, since they might have different user-defined defaults -->
<!-- tool-bug workaround: split big boolean queries into pieces to avoid overloading the Xalan/lotusxml query buffer -->
<xsl:variable name="notImplicitEvent"
select="not(local-name(..)='AudioClip' and (local-name()='duration' or local-name()='isActive')) and
not(contains(local-name(..),'Interpolator') and (local-name()='fraction' or local-name()='value')) and
not(local-name(..)='Background' and (local-name()='bind' or local-name()='bindTime' or local-name()='isBound')) and
not(local-name(..)='CylinderSensor' and (local-name()='isActive' or local-name()='rotation' or local-name()='trackPoint')) and
not(local-name(..)='Fog' and (local-name()='bind' or local-name()='bindTime' or local-name()='isBound')) and
not(local-name(..)='IndexedLineSet' and local-name()='lineWidth') and
not(local-name(..)='NavigationInfo' and (local-name()='bind' or local-name()='bindTime' or local-name()='isBound')) and
not(local-name(..)='PointSet' and local-name()='pointSize') and
not(local-name(..)='PlaneSensor' and (local-name()='isActive' or local-name()='translation' or local-name()='trackPoint')) and
not(local-name(..)='ProximitySensor' and (local-name()='isActive' or local-name()='position' or local-name()='orientation' or
local-name()='enterTime' or local-name()='exitTime')) and
not(local-name(..)='SphereSensor' and (local-name()='isActive' or local-name()='rotation' or local-name()='trackPoint')) and
not(local-name(..)='TimeSensor' and (local-name()='isActive' or local-name()='cycleTime' or local-name()='fraction' or
local-name()='time')) and
not(local-name(..)='TouchSensor' and (local-name()='isActive' or local-name()='isOver' or local-name()='hitNormal' or
local-name()='touchTime' or local-name()='hitPoint' or local-name()='hitTexCoord')) and
not(local-name(..)='Viewpoint' and (local-name()='bind' or local-name()='bindTime' or local-name()='isBound' or local-name()='examine'))" />
<xsl:variable name="notDefaultFieldValue1"
select="not( local-name()='bboxCenter' and (.='0 0 0' or .='0.0 0.0 0.0')) and
not( local-name()='bboxSize' and (.='-1 -1 -1' or .='-1.0 -1.0 -1.0')) and
not( local-name(..)='X3D' and local-name()='version' and (.='3.0')) and
not( local-name(..)='AudioClip' and
((local-name()='loop' and .='false') or
(local-name()='pitch' and (.='1' or .='1.0')) or
(local-name()='startTime' and (.='0' or .='0.0')) or
(local-name()='stopTime' and (.='0 0 0' or .='0.0 0.0 0.0')))) and
not( local-name(..)='Background' and local-name()='skyColor' and (.='0 0 0' or .='0.0 0.0 0.0')) and
not( local-name(..)='Billboard' and local-name()='axisOfRotation' and (.='0 1 0' or .='0.0 1.0 0.0')) and
not( local-name(..)='Box' and local-name()='size' and (.='2 2 2' or .='2.0 2.0 2.0')) and
not( local-name(..)='Collision' and local-name()='collide' and .='true') and
not( local-name(..)='Cone' and ((local-name()='bottomRadius' and (.='1' or .='1.0')) or
(local-name()='height' and (.='2' or .='2.0')) or
(local-name()='side' and .='true') or
(local-name()='bottom' and .='true'))) and
not( local-name(..)='Cylinder' and
((local-name()='height' and (.='2' or .='2.0')) or
(local-name()='radius' and (.='1' or .='1.0')) or
(local-name()='bottom' and .='true') or
(local-name()='side' and .='true') or
(local-name()='top' and .='true'))) and
not( local-name(..)='CylinderSensor' and
((local-name()='autoOffset' and .='true') or
(local-name()='enabled' and .='true') or
(local-name()='diskAngle' and .='0.262') or
(local-name()='offset' and (.='0' or .='0.0')) or
(local-name()='maxAngle' and (.='-1' or .='-1.0')) or
(local-name()='minAngle' and (.='0' or .='0.0'))))" />
<xsl:variable name="notDefaultFieldValue2"
select="not( local-name(..)='DirectionalLight' and
((local-name()='ambientIntensity' and (.='0' or .='0.0')) or
(local-name()='color' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='direction' and (.='0 0 -1' or .='0.0 0.0 -1.0')) or
(local-name()='intensity' and (.='1' or .='1.0')) or
(local-name()='on' and .='true'))) and
not( local-name(..)='ElevationGrid' and
((local-name()='ccw' and .='true') or
(local-name()='colorPerVertex' and .='true') or
(local-name()='normalPerVertex' and .='true') or
(local-name()='solid' and .='true') or
(local-name()='xDimension' and (.='0' or .='0.0')) or
(local-name()='xSpacing' and (.='1' or .='1.0')) or
(local-name()='zDimension' and (.='0' or .='0.0')) or
(local-name()='zSpacing' and (.='1' or .='1.0')) or
(local-name()='creaseAngle' and (.='0' or .='0.0')))) and
not( local-name(..)='Extrusion' and
((local-name()='beginCap' and .='true') or
(local-name()='ccw' and .='true') or
(local-name()='convex' and .='true') or
(local-name()='endCap' and .='true') or
(local-name()='solid' and .='true') or
(local-name()='creaseAngle' and (.='0' or .='0.0')) or
(local-name()='orientation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='scale' and (.='1 1' or .='1.0 1.0')) or
(local-name()='crossSection' and .='1 1, 1 -1, -1 -1, -1 1, 1 1') or
(local-name()='crossSection' and .='1 1 1 -1 -1 -1 -1 1 1 1') or
(local-name()='spine' and .='0 0 0, 0 1 0') or
(local-name()='spine' and .='0 0 0 0 1 0')))" />
<xsl:variable name="notDefaultFieldValue3"
select="not( local-name(..)='Fog' and ((local-name()='color' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='visibilityRange' and (.='0' or .='0.0')) or
(local-name()='fogType' and .='"LINEAR"'))) and
not( local-name(..)='FontStyle' and
((local-name()='horizontal' and .='true') or
(local-name()='leftToRight' and .='true') or
(local-name()='topToBottom' and .='true') or
(local-name()='size' and (.='1' or .='1.0')) or
(local-name()='spacing' and (.='1' or .='1.0')) or
(local-name()='family' and .='"SERIF"') or
(local-name()='justify' and .='"BEGIN"') or
(local-name()='style' and .='PLAIN'))) and
not( local-name(..)='ImageTexture' and
((local-name()='repeatS' and .='true') or
(local-name()='repeatT' and .='true'))) and
not( local-name(..)='IndexedFaceSet' and
((local-name()='ccw' and .='true') or
(local-name()='colorPerVertex' and .='true') or
(local-name()='convex' and .='true') or
(local-name()='normalPerVertex' and .='true') or
(local-name()='solid' and .='true') or
(local-name()='creaseAngle' and (.='0' or .='0.0')))) and
not( local-name(..)='IndexedLineSet' and local-name()='colorPerVertex' and .='true') and
not( local-name(..)='LOD ' and local-name()='center' and (.='0 0 0' or .='0.0 0.0 0.0')) and
not( local-name(..)='Material' and
((local-name()='ambientIntensity' and .='0.2') or
(local-name()='diffuseColor' and .='0.8 0.8 0.8') or
(local-name()='emissiveColor' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='shininess' and .='0.2') or
(local-name()='specularColor' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='transparency' and (.='0' or .='0.0'))))" />
<xsl:variable name="notDefaultFieldValue4"
select="not( local-name(..)='MovieTexture' and
((local-name()='loop' and .='false') or
(local-name()='speed' and (.='1' or .='1.0')) or
(local-name()='startTime' and (.='0' or .='0.0')) or
(local-name()='stopTime' and (.='0' or .='0.0')) or
(local-name()='repeatS' and .='true') or
(local-name()='repeatT' and .='true'))) and
not( local-name(..)='NavigationInfo' and
((local-name()='avatarSize' and .='0.25 1.6 0.75') or
(local-name()='headlight' and .='true') or
(local-name()='speed' and (.='1' or .='1.0')) or
(local-name()='visibilityLimit' and (.='0' or .='0.0')))) and
not( local-name(..)='PixelTexture' and
((local-name()='repeatS' and .='true') or
(local-name()='repeatT' and .='true') or
(local-name()='image' and (.='0 0 0' or .='0.0 0.0 0.0')))) and
not( local-name(..)='PlaneSensor' and
((local-name()='autoOffset' and .='true') or
(local-name()='enabled' and .='true') or
(local-name()='maxPosition' and (.='-1 -1' or .='-1.0 -1.0')) or
(local-name()='minPosition' and (.='0 0' or .='0.0 0.0')) or
(local-name()='offset' and (.='0 0 0' or .='0.0 0.0 0.0')))) and
not( local-name(..)='PointLight' and
((local-name()='ambientIntensity' and (.='0' or .='0.0'))or
(local-name()='attenuation' and (.='1 0 0' or .='1.0 0.0 0.0')) or
(local-name()='color' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='intensity' and (.='1' or .='1.0')) or
(local-name()='location' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='on' and .='true') or
(local-name()='radius' and (.='100' or .='100.0'))))" />
<xsl:variable name="notDefaultFieldValue5"
select="not( local-name(..)='ProximitySensor' and
((local-name()='center' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='size' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='enabled' and .='true'))) and
not( local-name(..)='Script' and ((local-name()='directOutput' and .='false') or
(local-name()='mustEvaluate' and .='false'))) and
not( local-name(..)='Sound' and ((local-name()='direction' and (.='0 0 1' or .='0.0 0.0 1.0')) or
(local-name()='intensity' and (.='1' or .='1.0')) or
(local-name()='location' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='priority' and (.='0' or .='0.0')) or
(local-name()='maxBack' and (.='10' or .='10.0')) or
(local-name()='maxFront' and (.='10' or .='10.0')) or
(local-name()='minBack' and (.='1' or .='1.0')) or
(local-name()='minFront' and (.='1' or .='1.0')) or
(local-name()='spatialize' and .='true'))) and
not( local-name(..)='Sphere' and local-name()='radius' and (.='1' or .='1.0')) and
not( local-name(..)='SphereSensor' and
((local-name()='autoOffset' and .='true') or
(local-name()='enabled' and .='true') or
(local-name()='offset' and (.='0 1 0 0' or .='0.0 1.0 0.0 0.0'))))" />
<xsl:variable name="notDefaultFieldValue6"
select="not( parent::SpotLight and
((local-name()='ambientIntensity' and (.='0' or .='0.0')) or
(local-name()='attenuation' and (.='1 0 0' or .='1.0 0.0 0.0')) or
(local-name()='beamwidth' and .='1.570796') or
(local-name()='color' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='cutOffAngle' and .='0.785398') or
(local-name()='direction' and (.='0 0 -1' or .='0.0 0.0 -1.0')) or
(local-name()='intensity' and (.='1' or .='1.0')) or
(local-name()='location' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='on' and .='true') or
(local-name()='radius' and (.='100' or .='100.0')))) and
not( local-name(..)='Switch' and local-name()='whichChoice' and (.='-1' or .='-1.0')) and
not( local-name(..)='Text' and local-name()='maxExtent' and (.='0' or .='0.0')) and
not( local-name(..)='TextureTransform' and
((local-name()='center' and (.='0 0' or .='0.0 0.0')) or
(local-name()='rotation' and (.='0' or .='0.0')) or
(local-name()='scale ' and (.='1 1' or .='1.0 1.0')) or
(local-name()='translation' and (.='0 0' or .='0.0 0.0')))) and
not( local-name(..)='Switch' and local-name()='whichChoice' and (.='-1' or .='-1.0'))" />
<xsl:variable name="notDefaultFieldValue7"
select="not( local-name(..)='TimeSensor' and
((local-name()='cycleInterval' and (.='1' or .='1.0')) or
(local-name()='enabled' and .='true') or
(local-name()='startTime' and (.='0' or .='0.0')) or
(local-name()='stopTime' and (.='0' or .='0.0')) or
(local-name()='loop' and .='false'))) and
not( local-name(..)='TouchSensor' and
local-name()='enabled' and .='true') and
not( local-name(..)='Transform' and
((local-name()='center' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='rotation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='scale' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='scaleOrientation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='translation' and (.='0 0 0' or .='0.0 0.0 0.0')))) and
not( local-name(..)='Viewpoint' and
((local-name()='fieldOfView' and .='0.785398') or
(local-name()='jump' and .='true') or
(local-name()='orientation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='position' and (.='0 0 10' or .='0.0 0.0 10.0')))) and
not( local-name(..)='VisibilitySensor' and
((local-name()='center' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='enabled' and .='true') or
(local-name()='size' and (.='0 0 0' or .='0.0 0.0 0.0'))))" />
<xsl:variable name="notDefaultHAnim"
select="not( local-name(..)='Joint' and
((local-name()='center' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='limitOrientation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='rotation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='scale' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='scaleOrientation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='stiffness' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='translation' and (.='0 0 0' or .='0.0 0.0 0.0')))) and
not( local-name(..)='Segment' and
((local-name()='bboxCenter' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='bboxSize' and (.='-1 -1 -1' or .='-1.0 -1.0 -1.0')) or
(local-name()='centerOfMass' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='mass' and (.='0' or .='0.0')) or
(local-name()='momentsOfInertia' and
(.='0 0 0 0 0 0 0 0 0' or .='0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0')))) and
not( local-name(..)='Site' and
((local-name()='center' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='rotation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='scale' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='scaleOrientation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='translation' and (.='0 0 0' or .='0.0 0.0 0.0')))) and
not( local-name(..)='Humanoid' and
((local-name()='bboxCenter' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='bboxSize' and (.='-1 -1 -1' or .='-1.0 -1.0 -1.0')) or
(local-name()='center' and (.='0 0 0' or .='0.0 0.0 0.0')) or
(local-name()='rotation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='scale' and (.='1 1 1' or .='1.0 1.0 1.0')) or
(local-name()='scaleOrientation' and (.='0 0 1 0' or .='0.0 0.0 1.0 0.0')) or
(local-name()='translation' and (.='0 0 0' or .='0.0 0.0 0.0'))))" />
<xsl:variable name="notFieldSpace"
select="not(local-name(..)='field' and (local-name()='space' or local-name()='xml:space')) and
not(local-name(..)='Script' and (local-name()='space' or local-name()='xml:space'))" />
<xsl:if test=" notImplicitEvent and
notDefaultFieldValue2 and
notDefaultFieldValue4 and
notDefaultFieldValue6 and
notDefaultHAnim and
<!--and not((local-name(../..)='Script' and local-name(..)='field') and (local-name()='xml:space' or local-name()='space')) -->
<!-- valid field found by the preceding checks, now output accordingly -->
<!-- single attributes can stay on same line, skip line otherwise -->
<!-- problem: appears to be counting default attributes in addition to user-defined attributes... -->
<xsl:if test="(count (../@*) > 2) or ((count (../@*) = 2) and (string-length(../@*[1]) + string-length(../@*[2]) > 72))">
<xsl:text> </xsl:text>
</xsl:if>
<xsl:if test="(local-name(..)='field' or local-name(..)='ProtoDeclare' or local-name(..)='ExternProtoDeclare') and (local-name()='appInfo' or local-name()='documentation')">
<xsl:text><br> &nbsp;</xsl:text>
</xsl:if>
<xsl:text> <font color="GREEN"></xsl:text>
<!-- output actual attribute value. try to break MFStrings into multiple lines. -->
<xsl:value-of select="local-name()"/>
<xsl:text></font><b>='</b></xsl:text>
<xsl:choose>
<!-- print out urls containing javascript source without further ado -->
<xsl:when test="(local-name()='url' and starts-with(normalize-space(.),'javascript:'))">
<xsl:text><PRE></xsl:text>
<xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>
<xsl:text></PRE></xsl:text>
</xsl:when>
<!-- make single url reference into actual A HREF= link -->
<xsl:when test="(local-name()='url' or contains(local-name(), 'Url') or (local-name(..)='meta' and (../@name='url' or ../@name='filename' or ../@name='reference' or ../@name='copyright' or ../@name='drawing' or ../@name='image' or ../@name='movie' or ../@name='photo' or ../@name='photograph' or ../@name='diagram' or contains(../@name,'exture')) and local-name()='content')) and not(starts-with(normalize-space(.),'"')) and (contains(.,'.') or starts-with(normalize-space(.),'Makefile')) and not(substring(normalize-space(.),string-length(normalize-space(.))) = '.')">
<xsl:text><a href="</xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>"><xsl:text></a></xsl:text></xsl:when>
<xsl:when test="(local-name()='url' or contains(local-name(), 'Url') or (local-name(..)='meta' and (../@name='url' or ../@name='filename' or ../@name='reference' or ../@name='drawing' or ../@name='image' or ../@name='movie' or ../@name='photo' or ../@name='photograph' or ../@name='diagram') and local-name()='content')) and starts-with(normalize-space(.),'"') and not(contains(normalize-space(.),'" "')) and (contains(.,'.') or starts-with(normalize-space(.),'Makefile')) and not(substring(normalize-space(.),string-length(normalize-space(.))) = '.')">
<xsl:text><a href=</xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>><xsl:text></a></xsl:text></xsl:when>
<!-- break and make multiple url references into actual A HREF= links -->
<xsl:when test="(local-name()='url' or contains(local-name(), 'Url') or (local-name(..)='meta' and (../@name='url' or ../@name='filename' or ../@name='reference' or ../@name='drawing' or ../@name='image' or ../@name='movie' or ../@name='photo' or ../@name='photograph' or ../@name='diagram') and local-name()='content')) and starts-with(normalize-space(.),'"') and contains(normalize-space(.),'" "')">
<xsl:call-template name="URL-ize-MFString-elements">
<xsl:with-param name="list" select="normalize-space(.)"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="(local-name(..)='field' or local-name(..)='ProtoDeclare' or local-name(..)='ExternProtoDeclare') and (local-name()='documentation')">
<xsl:text><a href="</xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>"><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/><xsl:text></a></xsl:text>
</xsl:when>
<xsl:when test="starts-with(normalize-space(.),'http://')">
<xsl:text><a href="</xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>"><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/><xsl:text></a></xsl:text>
</xsl:when>
<xsl:when test="(local-name(..)='meta' and local-name()='content') and (../@name='mail' or ../@name='email' or ../@name='e-mail')">
<xsl:text><a href="</xsl:text>
<xsl:if test="contains(.,'@') and not(contains(.,'mailto:'))">
<xsl:text>mailto:</xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>
<xsl:text>"></xsl:text>
<xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>
<xsl:text></a></xsl:text>
</xsl:when>
<xsl:when test="(local-name(..)='meta' and local-name()='content') and (../@name='drawing' or ../@name='image' or ../@name='movie' or ../@name='photo' or ../@name='photograph')">
<xsl:text><a href="</xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>"><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/><xsl:text></a></xsl:text>
</xsl:when>
<xsl:when test="starts-with(.,'X3D-Edit, ')">
<xsl:variable name="containedUrl" select="substring-after(.,'X3D-Edit, ')"/>
<xsl:text>X3D-Edit, </xsl:text>
<xsl:text><a href="</xsl:text><xsl:value-of select="containedUrl" disable-output-escaping="yes"/>" target="_blank"><xsl:text></a></xsl:text>
</xsl:when>
<xsl:when test="starts-with(.,'Xvl3ToX3d, ')">
<xsl:variable name="containedUrl" select="substring-after(.,'Xvl3ToX3d, ')"/>
<xsl:text>Xvl3ToX3d, </xsl:text>
<xsl:text><a href="</xsl:text><xsl:value-of select="containedUrl" disable-output-escaping="yes"/>" target="_blank"><xsl:text></a></xsl:text>
</xsl:when>
<xsl:when test="(local-name(..)='meta' and local-name()='content' and ../@name='generator') and (contains(.,'.') and (not(contains(.,' '))))">
<xsl:text><a href="</xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/>"><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/><xsl:text></a></xsl:text>
</xsl:when>
<xsl:when test="local-name()='url'">
<xsl:text><font color="BLACK"></xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/><xsl:text></font></xsl:text>
</xsl:when>
<xsl:when test="local-name()='name' and (local-name(..)='field' or local-name(..)='fieldValue' or local-name(..)='ProtoDeclare' or local-name(..)='ExternProtoDeclare' or local-name(..)='ProtoInstance')">
<xsl:text><font color="PURPLE"></xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/><xsl:text></font></xsl:text>
</xsl:when>
<xsl:when test="local-name()='DEF' or local-name()='USE' or (local-name(..)='ROUTE' and contains(local-name(),'Node')) or (local-name(..)='USE' and local-name()='node')">
<xsl:text><font color="BROWN"></xsl:text><xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/><xsl:text></font></xsl:text>
</xsl:when>
<xsl:when test="local-name()='IS'">
<xsl:call-template name="format-IS-pairs">
<xsl:with-param name="list" select="normalize-space(.)"/>
</xsl:call-template>
</xsl:when>
<!-- meta warning -->
<xsl:when test="local-name(..)='meta' and local-name()='name' and .='warning'">
<!-- remove extraneous space for better formatting, even though this might obscure some content problems/preferences. -->
<xsl:text><b><U><font color="ORANGE"></xsl:text><xsl:value-of select="normalize-space(.)"/><xsl:text></font></U></b></xsl:text>
</xsl:when>
<xsl:otherwise>
<!-- remove extraneous space for better formatting, even though this might obscure some content problems/preferences. -->
<xsl:text><font color="TEAL"></xsl:text><xsl:value-of select="normalize-space(.)"/><xsl:text></font></xsl:text>
</xsl:otherwise>
<!-- <xsl:text></xsl:text><xsl:value-of select="normalize-space(.)"/></xsl:otherwise> -->
</xsl:choose>
<xsl:text><b>'</b></xsl:text>
<xsl:if test="contains(local-name(), 'Url')"><xsl:text><br> </xsl:text></xsl:if><!-- -->
</xsl:if>
</xsl:template>
<!-- ****** URL-ize-MFString-elements: callable template (recursive function) ****** -->
<!-- follows examples in Michael Kay's _XSLT_, pp. 551-554 -->
<!-- this will need modification if SFURL/MFURL types are created -->
<xsl:template name="URL-ize-MFString-elements">
<xsl:param name="list"/>
<xsl:variable name="wlist" select="concat(normalize-space(list),' ')"/>
<!-- <xsl:text> wlist" disable-output-escaping="yes"/><xsl:text>] </xsl:text> -->
<xsl:choose>
<xsl:when test="
<xsl:variable name="nextURL" select="translate(substring-before(wlist,' '),'"','')"/>
<xsl:variable name="restURLs" select="substring-after(
<!-- <xsl:text> restURLs=[</xsl:text><xsl:value-of select="<xsl:text>] </xsl:text> -->
<!-- output URL-ized nextURL -->
<xsl:text>"<A href="</xsl:text><xsl:value-of select="normalize-space(nextURL)"/>"><xsl:text></A>"</xsl:text>
<!-- recurse on remainder of list of URLs -->
<xsl:if test="restURLs!=''">
<xsl:text> </xsl:text>
<xsl:call-template name="URL-ize-MFString-elements">
<xsl:with-param name="list" select="
</xsl:call-template>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- ****** format-IS-pairs: callable template (recursive function) ****** -->
<!-- follows examples in Michael Kay's _XSLT_, pp. 551-554 -->
<xsl:template name="format-IS-pairs">
<xsl:param name="list"/>
<xsl:variable name="wlist" select="concat(normalize-space(list),' ')"/>
<!-- <xsl:text> wlist" disable-output-escaping="yes"/><xsl:text>] </xsl:text> -->
<xsl:choose>
<xsl:when test="
<xsl:variable name="nextPair" select="translate(substring-before(wlist,' '),'"','')"/>
<xsl:variable name="restPairs" select="substring-after(
<!-- <xsl:text> restPairs=[</xsl:text><xsl:value-of select="<xsl:text>] </xsl:text> -->
<!-- output fonted IS NodeName.fieldName pair -->
<xsl:text><font color="BROWN"></xsl:text><xsl:value-of select="substring-before(nextPair,'.')"/><xsl:text></font></xsl:text>
<xsl:text><b>.</b></xsl:text>
<xsl:text><font color="PURPLE"></xsl:text><xsl:value-of select="substring-after(<xsl:text></font></xsl:text>
<!-- recurse on remainder of list of URLs -->
<xsl:if test="restPairs!=''">
<xsl:text>&nbsp;&nbsp;&nbsp; </xsl:text>
<xsl:call-template name="format-IS-pairs">
<xsl:with-param name="list" select="
</xsl:call-template>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- ****** children: flag wrapper tags ****** -->
<xsl:template match="appearance[parent::Shape] |
children[parent::Anchor or parent::Billboard or parent::Collision or parent::Group or parent::Transform] |
choice[parent::Switch] |
color[parent::ElevationGrid or parent::IndexedFaceSet or parent::IndexedLineSet or parent::PointSet] |
coord[parent::IndexedFaceSet or parent::IndexedLineSet or parent::PointSet] |
fontStyle[parent::Text] |
geometry[parent::Shape] |
level[parent::LOD] |
material[parent::Appearance] |
normal[parent::ElevationGrid or parent::IndexedFaceSet] |
source[parent::Sound] |
texCoord[parent::ElevationGrid or parent::IndexedFaceSet] |
texture[parent::Appearance] |
textureTransform[parent::Appearance]">
<!-- first, output tag name -->
<xsl:text><font color="BLUE">&lt;</xsl:text><xsl:value-of select="local-name()"/>
<!-- appropriate angle-bracket close of first tag -->
<xsl:choose>
<xsl:when test="not(*)"><xsl:text>/&gt;</xsl:text></xsl:when>
<xsl:otherwise><xsl:text>&gt;</xsl:text></xsl:otherwise>
</xsl:choose>
<!-- insert warning comment after wrapper tag -->
<!-- <xsl:comment> wrapper tag </xsl:comment> -->
<!-- prepare format for next tag, insert blockquote if children present -->
<xsl:choose>
<xsl:when test="not(*)"><xsl:text> </font></xsl:text></xsl:when>
<xsl:otherwise><xsl:text></font><blockquote></xsl:text></xsl:otherwise>
</xsl:choose>
<!-- recurse on next tag -->
<xsl:apply-templates />
<!-- add a closing tag if children were present -->
<xsl:if test="*">
<xsl:text></blockquote> <font color="BLUE">&lt;/</xsl:text>
<xsl:value-of select="local-name()"/>
<xsl:text>&gt;</font> </xsl:text>
</xsl:if>
</xsl:template>
<!-- ****** XML comments ****** -->
<xsl:template match="comment()[ancestor::X3D]">
<!-- <xsl:text><PRE></xsl:text> -->
<xsl:text>&lt;!-- </xsl:text><xsl:value-of select="normalize-space(.)"/><xsl:text> --&gt;</xsl:text>
<!-- <xsl:text></PRE></xsl:text> -->
<xsl:text> </xsl:text>
<!-- *** need test for last -->
<xsl:text><br> </xsl:text>
</xsl:template>
<!-- ****** XML processing-instruction ****** -->
<xsl:template match="processing-instruction()">
<xsl:text><-- </xsl:text><xsl:value-of select="."/><xsl:text> --> </xsl:text>
</xsl:template>
<!-- ****** Script node: preserve CDATA delimiters ****** -->
<xsl:template match="Script[text() and not (normalize-space(.)='' or normalize-space(.)=' ')]">
<!-- first tag name -->
<xsl:text>&lt;<font color="NAVY"></xsl:text><xsl:value-of select="local-name()"/><xsl:text></font></xsl:text>
<!-- next attributes, if any -->
<xsl:apply-templates select="@*"/>
<xsl:text>&gt; <blockquote></xsl:text>
<xsl:apply-templates select="field | comment()"/>
<xsl:text><PRE> </xsl:text>
<xsl:text><b>&lt;![CDATA[</b> </xsl:text>
<xsl:for-each select="text()">
<xsl:choose>
<xsl:when test="(normalize-space(.)='' or normalize-space(.)=' ') and preceding::field"></xsl:when><!--<xsl:text>// stripped LF before field </xsl:text> -->
<xsl:when test="(normalize-space(.)='' or normalize-space(.)=' ') and following::field"></xsl:when><!--<xsl:text>// stripped LF after field </xsl:text> -->
<!-- *** need to convert '<' to < -->
<xsl:otherwise>
<xsl:call-template name="escape-lessthan-characters">
<xsl:with-param name="inputString" select="."/>
</xsl:call-template>
</xsl:otherwise><!--translate(,'javascript:','')-->
</xsl:choose>
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:text><b>]]&gt;</b> </xsl:text>
<xsl:text></PRE> </xsl:text>
<xsl:text></blockquote> &lt;/<font color="NAVY"></xsl:text>
<xsl:value-of select="local-name()"/>
<xsl:text></font>&gt; </xsl:text>
<xsl:text><br> </xsl:text>
</xsl:template>
<xsl:template name="escape-lessthan-characters"> <!-- < is < -->
<xsl:param name="inputString" select="0"/>
<!-- <xsl:text>// ### </xsl:text> -->
<!-- <xsl:text> inputString received: </xsl:text><xsl:value-of select="inputString"/><xsl:text> </xsl:text> -->
<xsl:choose>
<xsl:when test="contains(
<xsl:value-of select="substring-before(inputString,'<')"/>
<xsl:text>&lt;</xsl:text>
<xsl:call-template name="escape-lessthan-characters">
<xsl:with-param name="inputString" select="substring-after(
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="inputString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="escape-double-ampersand-characters"> <!-- & is & -->
<xsl:param name="inputString" select="0"/>
<xsl:text>// amp </xsl:text>
<!-- <xsl:text> inputString received: </xsl:text><xsl:value-of select="<xsl:text> </xsl:text> -->
<xsl:if test="contains(inputString,'&&')">
<xsl:value-of select="substring-before(
<xsl:text>&amp;&amp;</xsl:text>
<xsl:call-template name="escape-lessthan-characters">
<xsl:with-param name="inputString" select="substring-after(inputString,'&&')"/>
</xsl:call-template>
<xsl:if test="substring-after(
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
[]
readme
course
preface
I
1
2
II
3
4
III
5
6
7
IV
8
9
10
V
11
12
afterthoughts
appendix
references
examples
resources
(C) A. Eliëns
9/8/2006
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.