<?xml version="1.0" encoding="UTF-8"?>
<!-- This is the adaptable part of the SVG Linealizer package, displaying the RDF predicates 
     defined by the package.

     Ivan Herman, W3C
     Last update: $Date: 2001/07/09 11:44:49 $
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink" exclude-result-prefixes="xsl rdf xlink">
  <!-- ================================================================================== -->
  <!-- Utility Functions                                                                  -->
  <!-- ================================================================================== -->
  <!-- General description of an svg resource: the desc element following it immediately is searched and
       used
  -->
  <xsl:template name="generateText">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:choose>
      <xsl:when test="$objectType = $uriReferenceType">
        <xsl:for-each select="//*[@id = substring-after($object,'#')]/descendant-or-self::text">
          <xsl:value-of select="."/>
          <xsl:if test="position() != last()">
            <xsl:text>, </xsl:text>
          </xsl:if>
        </xsl:for-each>
      </xsl:when>
      <xsl:when test="$objectType = $stringType"> "<xsl:value-of select="$object"/>"</xsl:when>
    </xsl:choose>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Generation of position information                                                 -->
  <xsl:template name="generatePosition">
    <xsl:param name="position"/>
    <xsl:choose>
      <xsl:when test="$position = 'M'"> in the middle </xsl:when>
      <xsl:when test="$position = 'N'"> at north </xsl:when>
      <xsl:when test="$position = 'W'"> at west </xsl:when>
      <xsl:when test="$position = 'E'"> at east </xsl:when>
      <xsl:when test="$position = 'S'"> at south </xsl:when>
      <xsl:when test="$position = 'NE'"> at north-east </xsl:when>
      <xsl:when test="$position = 'NW'"> at north-west </xsl:when>
      <xsl:when test="$position = 'SW'"> at south-west </xsl:when>
      <xsl:when test="$position = 'SE'"> at south-east </xsl:when>
      <xsl:when test="$position = 'NNE'"> at north north-east </xsl:when>
      <xsl:when test="$position = 'NNW'"> at north north-west </xsl:when>
      <xsl:when test="$position = 'ENE'"> at east north-east </xsl:when>
      <xsl:when test="$position = 'WNW'"> at west north-west </xsl:when>
      <xsl:when test="$position = 'SSW'"> at south south-west </xsl:when>
      <xsl:when test="$position = 'SSE'"> at south south-east </xsl:when>
      <xsl:when test="$position = 'WSW'"> at west south-west </xsl:when>
      <xsl:when test="$position = 'ESE'"> at eath south-east </xsl:when>
    </xsl:choose>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Get and use the description of an object  -->
  <xsl:template name="describe">
    <xsl:param name="nodeName"/>
    <xsl:variable name="nodeName_n" select="substring-after($nodeName,'#')"/>
    <xsl:if test="//*[@id = $nodeName_n]/child::desc[1]">
      <xsl:value-of select="//*[@id = $nodeName_n]/child::desc[1]"/>
    </xsl:if>
    <xsl:if test="//*[@rdf:ID = $nodeName_n]/child::desc[1]">
      <xsl:value-of select="//*[@rdf:ID = $nodeName_n]/child::desc[1]"/>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- General description of an svg resource: the desc element following it 
       immediately is searched and used
  -->
  <xsl:template name="describeResource">
    <xsl:param name="nodeName"/>
    <p class="descMajor">
      <xsl:call-template name="describe">
        <xsl:with-param name="nodeName" select="$nodeName"/>
      </xsl:call-template>
    </p>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Generation of a resource reference preceded by a text. If no reference is there,
       the text is displayed, and the statement is supposed to be extended by a sequence of
       'li'-s
  -->
  <xsl:template name="boiler-plate">
    <xsl:param name="object"/>
    <xsl:param name="text"/>
    <xsl:param name="objectType"/>
    <xsl:text>The object </xsl:text>
    <xsl:choose>
      <xsl:when test="$object">
        <xsl:value-of select="$text"/> "<xsl:value-of select="$object"/>
          (<span class="desc">
          <xsl:call-template name="describe">
            <xsl:with-param name="nodeName" select="$object"/>
          </xsl:call-template>
        </span>)"
      </xsl:when>
      <!-- The real description is in a separate anonymous resource! -->
      <xsl:otherwise>
        <xsl:value-of select="$text"/>:</xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Setting the title of the full slide                                                -->
  <!-- ================================================================================== -->
  <xsl:template name="setTitle">
    <xsl:if test="/svg/title">
      <title>
        Overview of the slide "<xsl:value-of select="/svg/title"/>"
      </title>
    </xsl:if>
    <style type="text/css">
     .desc      { color: maroon; speech-rate: slower; font-style: italic; }
     .descMajor { color: maroon; speech-rate: slower; font-weight: bold; }
     .resource  { font-size: 150%; font-weight: bold; }
    </style>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Preamble: start-up of the description file content: the title of the slide is the overall 
       title of the page, with the (possible) description following it right away
  -->
  <!-- ================================================================================== -->
  <xsl:template name="preamble">
    <xsl:choose>
      <xsl:when test="/svg/title">
        <h1>Title of the slide: "<xsl:value-of select="/svg/title"/>"
        </h1>
        <p class="descMajor">
          <xsl:if test="/svg/title/following::desc">
            <xsl:value-of select="/svg/title/following::desc"/>
          </xsl:if>
        </p>
      </xsl:when>
      <xsl:otherwise>
        <h1>Title of the slide is unknown</h1>
        <p class="descMajor">
          <xsl:if test="/svg/child::desc and /svg/child::desc[1] = /svg/child::*[1]">
            <xsl:value-of select="/svg/child::desc[1]"/>
          </xsl:if>
        </p>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!-- ================================================================================== -->
  <!--       Real description of the various properties!                                  -->
  <!-- ================================================================================== -->
  <!-- Default version -->
  <xsl:template name="default-display">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:choose>
      <xsl:when test="$objectType = $uriReferenceType">
        <xsl:choose>
          <xsl:when test="$object"> the object "<xsl:value-of select="$object"/>
            <xsl:text> (</xsl:text>
            <span class="desc">
              <xsl:call-template name="describe">
                <xsl:with-param name="nodeName" select="$object"/>
              </xsl:call-template>
            </span>
            <xsl:text>)"</xsl:text>
          </xsl:when>
        </xsl:choose>
      </xsl:when>
      <xsl:when test="$objectType = $stringType"> the value "<xsl:value-of select="$object"/>"</xsl:when>
      <!-- @@parsetype literal will give us content here -->
      <xsl:otherwise>
        <xsl:message>unknown object type: <xsl:value-of select="$objectType"/>
        </xsl:message>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- the type of the graphics. At present, the following categories seem to make sense,
       see also Daniel's overview:
              Numeric or Chart
              Conceptual
              Clip-art
              Decorative
              Special
       this categorization may have to be refined
  -->
  <xsl:template name="GraphicsType">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        The type of the graphics is <xsl:value-of select="$object"/>
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Is it a hyperlink anchor -->
  <xsl:template name="IsAnchor">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:param name="subject"/>
    <xsl:variable name="subject_n" select="substring-after($subject,'#')"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $uriReferenceType">
         "<xsl:value-of select="$uriReferenceType"/>"
      </xsl:if>
      <xsl:if test="$objectType = $stringType">
        <xsl:if test="$object = 'true'">The object is a hyperlink anchor for the URI:
         "<xsl:value-of select="//*[@id = $subject_n]/ancestor-or-self::a/@xlink:href"/>"
			  <xsl:choose>
            <xsl:when test="//*[@id = $subject_n]/ancestor-or-self::a/child::desc[1]">
              (<span class="desc">
                <xsl:value-of select="//*[@id = $subject_n]/ancestor-or-self::a/child::desc[1]"/>
              </span>)
            </xsl:when>
          </xsl:choose>
        </xsl:if>
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- list item (from a bag, seq, etc) -->
  <xsl:template name="list-item">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:param name="parentElement"/>
    <xsl:choose>
      <xsl:when test="$parentElement = 'LabelledBy'">
        "<xsl:call-template name="generateText">
          <xsl:with-param name="object" select="$object"/>
          <xsl:with-param name="objectType" select="$objectType"/>
        </xsl:call-template>"
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="default-display">
          <xsl:with-param name="object" select="$object"/>
          <xsl:with-param name="objectType" select="$objectType"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- is a symbol definition -->
  <xsl:template name="IsDef">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        <xsl:if test="$object = 'true'">The object is a symbol definition</xsl:if>
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Is an instance of a symbol definition -->
  <xsl:template name="InstanceOf">
    <xsl:param name="object"/>
    <xsl:choose>
      <xsl:when test="$object">The object is an instance of the predefined symbol "<xsl:value-of select="$object"/>"
      </xsl:when>
      <!-- The real description is in a separate anonymous resource! -->
      <xsl:otherwise>The object is:</xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Is a symbol definition -->
  <xsl:template name="Symbol">
    <xsl:param name="object"/>
    an instance of the predefined symbol "<xsl:value-of select="$object"/>"
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Is a Transformation -->
  <xsl:template name="Transformation">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:variable name="tr">
        <xsl:if test="$objectType = $stringType">
          <xsl:value-of select="$object"/>
        </xsl:if>
        <xsl:if test="$objectType = $uriReferenceType">
          <xsl:value-of select="//*[@id = substring-after($object,'#')]/@transform"/>
        </xsl:if>
      </xsl:variable>
      the transformation "<xsl:value-of select="$tr"/>" is applied
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- is a text node -->
  <xsl:template name="Text">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:param name="subject"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        <xsl:if test="$object = 'true'">The object is a pure textual node; value is: 
        <pre>
            <xsl:call-template name="generateText">
              <xsl:with-param name="object" select="$subject"/>
              <xsl:with-param name="objectType" select="$uriReferenceType"/>
            </xsl:call-template>
          </pre>
        </xsl:if>
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- is labelled by a text -->
  <xsl:template name="LabelledBy">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    The object is labelled by:
    <xsl:if test="$object">
      "<xsl:call-template name="generateText">
        <xsl:with-param name="object" select="$object"/>
        <xsl:with-param name="objectType" select="$objectType"/>
      </xsl:call-template>"
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- is a labelled 'by itself' -->
  <xsl:template name="Labelled">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:param name="subject"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        <xsl:if test="$object = 'true'">The object is labelled by: 
          "<xsl:call-template name="generateText">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>"
        </xsl:if>
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- is a position on the canvas -->
  <xsl:template name="InPosition">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        The object is 
          <xsl:call-template name="generatePosition">
          <xsl:with-param name="position" select="$object"/>
        </xsl:call-template> 
        of the full canvas
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- is in direction (the real content is in the enclosed anonymous resource! -->
  <xsl:template name="InDirection">
     The object is positioned:
  </xsl:template>
  <!-- Relative to -->
  <xsl:template name="RelativeTo">
    <xsl:param name="object"/>
    relative to the object "<xsl:value-of select="$object"/>"
  </xsl:template>
  <!-- is a position on the canvas -->
  <xsl:template name="Direction">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        <xsl:call-template name="generatePosition">
          <xsl:with-param name="position" select="$object"/>
        </xsl:call-template> 
        of the referred object
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Chart Type -->
  <xsl:template name="Shape">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        the shape is: "<xsl:value-of select="$object"/>"
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Chart Type -->
  <xsl:template name="ChartType">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        the chart is of type: "<xsl:value-of select="$object"/>"
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Category; used, eg, in charts -->
  <xsl:template name="DataCategory">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        the category of the data is: "<xsl:value-of select="$object"/>"
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Data values; if a resource is given, the 'd' attribute is displayed which works if
       the object is a path.
       This should be refined at some point...
  -->
  <xsl:template name="DataValues">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:if test="$objectType = $stringType">
        the data values are: "<xsl:value-of select="$object"/>"
      </xsl:if>
      <xsl:if test="$objectType = $uriReferenceType">
        <xsl:text>the data values are: "</xsl:text>
        <xsl:call-template name="describe">
          <xsl:with-param name="nodeName" select="$object"/>
        </xsl:call-template>
        <xsl:text>"</xsl:text>
      </xsl:if>
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Legend for the axes -->
  <xsl:template name="Legend">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:param name="axis"/>
    The legend on the <xsl:value-of select="$axis"/> axis is:
    <xsl:if test="$object">
      "<xsl:call-template name="generateText">
        <xsl:with-param name="object" select="$object"/>
        <xsl:with-param name="objectType" select="$objectType"/>
      </xsl:call-template>"
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Animation begins -->
  <xsl:template name="AnimationBegins">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:variable name="tr">
        <xsl:if test="$objectType = $stringType">
          <xsl:value-of select="$object"/>
        </xsl:if>
        <xsl:if test="$objectType = $uriReferenceType">
          <xsl:value-of select="//*[@id = substring-after($object,'#')]/@begin"/>
        </xsl:if>
      </xsl:variable>
      the animation begins at: "<xsl:value-of select="$tr"/>"
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Animation begins -->
  <xsl:template name="AnimationDuration">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$object">
      <xsl:variable name="tr">
        <xsl:if test="$objectType = $stringType">
          <xsl:value-of select="$object"/>
        </xsl:if>
        <xsl:if test="$objectType = $uriReferenceType">
          <xsl:value-of select="//*[@id = substring-after($object,'#')]/@dur"/>
        </xsl:if>
      </xsl:variable>
      the duration of the animation is of: "<xsl:value-of select="$tr"/>"
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- Generation of a simple text for seq and par animations  -->
  <xsl:template name="animation-boiler-plate">
    <xsl:param name="text"/>
    <xsl:text>These animations are performed </xsl:text>
    <xsl:value-of select="$text"/>:
  </xsl:template>
  <!-- ================================================================================== -->
  <!-- General template for rdf:type -->
  <xsl:template name="type">
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:if test="$objectType = $uriReferenceType">
      The type of the object is "<xsl:value-of select="$object"/>"
    </xsl:if>
  </xsl:template>
  <!-- ================================================================================== -->
  <!--       The final output of a statement, called from the parser                                              -->
  <!-- ================================================================================== -->
  <xsl:template name="finalOutput">
    <xsl:param name="subject"/>
    <xsl:param name="predicate"/>
    <xsl:param name="object"/>
    <xsl:param name="objectType"/>
    <xsl:param name="parentElement"/>
    <xsl:variable name="pName" select="substring-after($predicate,'#')"/>
    <!-- For the time being, I swallow the rdf:type predicates, they are important for schema compliance only! -->
    <xsl:if test="$pName != '' and $pName != 'type'">
      <xsl:text disable-output-escaping="yes">&lt;li&gt;</xsl:text>
      <xsl:choose>
        <xsl:when test="$pName = 'GraphicsType'">
          <xsl:call-template name="GraphicsType">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'IsAnchor'">
          <xsl:call-template name="IsAnchor">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="subject" select="$subject"/>
          </xsl:call-template>
        </xsl:when>
        <!--Structural predicates-->
        <xsl:when test="$pName = 'Contains'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'contains'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'IsPartOf'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is part of'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'IsConvergencePoint'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is a convergence point for'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'ExpandsTo'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'expands to'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'IsConnected'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is connected to'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'PointsTo'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'points to'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Associated'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is associated with'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Links'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'links'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Connects'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'connects'"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'IsDef'">
          <xsl:call-template name="IsDef">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'InstanceOf'">
          <xsl:call-template name="InstanceOf">
            <xsl:with-param name="object" select="$object"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Symbol'">
          <xsl:call-template name="Symbol">
            <xsl:with-param name="object" select="$object"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Transformation'">
          <xsl:call-template name="Transformation">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Text'">
          <xsl:call-template name="Text">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="subject" select="$subject"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'LabelledBy'">
          <xsl:call-template name="LabelledBy">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Labelled'">
          <xsl:call-template name="Labelled">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="subject" select="$subject"/>
          </xsl:call-template>
        </xsl:when>
        <!--Layout and Positional predicates-->
        <xsl:when test="$pName = 'InPosition'">
          <xsl:call-template name="InPosition">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'InDirection'">
          <xsl:call-template name="InDirection"/>
        </xsl:when>
        <xsl:when test="$pName = 'RelativeTo'">
          <xsl:call-template name="RelativeTo">
            <xsl:with-param name="object" select="$object"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Direction'">
          <xsl:call-template name="Direction">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'IsGoingThrough'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is going through'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'MaskedBy'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is masked by'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'InFrontOf'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is in front of'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Behind'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is behind of'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'AtLeft'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'has on its left'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'AtRight'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'has on its right'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'OnTop'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is on top of'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Under'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is under'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'HasOnTop'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'has on top'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'IsLayeredOn'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is layered on'"/>
          </xsl:call-template>
        </xsl:when>
        <!--Chart predicates-->
        <xsl:when test="$pName = 'Chart'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is a chart'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'ChartType'">
          <xsl:call-template name="ChartType">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'DataCategory'">
          <xsl:call-template name="DataCategory">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'DataValues'">
          <xsl:call-template name="DataValues">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'XLegend'">
          <xsl:call-template name="Legend">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="axis" select="'X'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'YLegend'">
          <xsl:call-template name="Legend">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="axis" select="'Y'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'ZLegend'">
          <xsl:call-template name="Legend">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="axis" select="'Z'"/>
          </xsl:call-template>
        </xsl:when>
        <!--Vocabulary for animation-->
        <xsl:when test="$pName = 'AnimatedBy'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is animated by'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'AnimationSubjects'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'animates'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'AnimationBegins'">
          <xsl:call-template name="AnimationBegins">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'AnimationDuration'">
          <xsl:call-template name="AnimationDuration">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'AnimationSeq'">
          <xsl:call-template name="animation-boiler-plate">
            <xsl:with-param name="text" select="'sequentially'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'AnimationPar'">
          <xsl:call-template name="animation-boiler-plate">
            <xsl:with-param name="text" select="'in parallel'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'VisualEffects'">
          <xsl:call-template name="boiler-plate">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="text" select="'is visually affected by'"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'Shape'">
          <xsl:call-template name="Shape">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <!--Not part of the published vocabulary, but necessary for processing-->
        <xsl:when test="$pName = 'li'">
          <xsl:call-template name="list-item">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="parentElement" select="$parentElement"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="$pName = 'type'">
          <xsl:call-template name="type">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
          </xsl:call-template>
        </xsl:when>
        <!-- Nothing happens; the description should be treated somewhere else -->
        <xsl:when test="$pName = 'desc'"/>
        <xsl:otherwise>
          <em>Undefined Property "<xsl:value-of select="$pName"/>"! </em>
          <xsl:call-template name="default-display">
            <xsl:with-param name="object" select="$object"/>
            <xsl:with-param name="objectType" select="$objectType"/>
            <xsl:with-param name="parentElement" select="$parentElement"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:text disable-output-escaping="yes">&lt;/li&gt;&#xA;</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
