| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | <?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:fn="http://www.w3.org/2005/xpath-functions"  xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"  xmlns:err="http://www.w3.org/2005/xqt-errors"  xmlns:ctk="http://www.commontk.org"  exclude-result-prefixes="xs xdt err fn">  <xsl:output method="xhtml" indent="yes"/>  <!--  ===================================================================    Utility XSLT 2.0 functions  ===================================================================  -->  <!-- Map xml parameter element names (types) to a class attribute. -->  <xsl:function name="ctk:mapTypeToXmlClass">    <xsl:param name="cliType"/>    <xsl:choose>      <xsl:when test="$cliType='boolean'">bool</xsl:when>      <xsl:when test="$cliType='integer'">number</xsl:when>      <xsl:when test="$cliType='float'">double</xsl:when>      <xsl:when test="$cliType=('point', 'region', 'image', 'file', 'directory', 'geometry', 'integer-vector', 'double-vector', 'float-vector', 'string-vector', 'integer-enumeration', 'double-enumeration', 'float-enumeration', 'string-enumeration')">string</xsl:when>      <xsl:otherwise><xsl:value-of select="$cliType"/></xsl:otherwise>    </xsl:choose>  </xsl:function>  <!-- Map xml parameter element names (types) to the Qt widget property containing       the current value. The property value type should match the (Qt) C++ type       (or be convertible to it). -->  <xsl:function name="ctk:mapTypeToQtValueProperty">    <xsl:param name="cliType"/>    <xsl:choose>      <xsl:when test="$cliType='boolean'">checked</xsl:when>      <xsl:when test="$cliType= ('point', 'region')">coordinates</xsl:when>      <xsl:when test="$cliType= ('image', 'file', 'directory', 'geometry')">currentPath</xsl:when>      <xsl:when test="$cliType= ('string', 'integer-vector', 'float-vector', 'double-vector', 'string-vector')">text</xsl:when>      <xsl:when test="$cliType= ('integer-enumeration', 'float-enumeration', 'double-enumeration', 'string-enumeration')">currentText</xsl:when>      <xsl:otherwise>value</xsl:otherwise>    </xsl:choose>  </xsl:function>  <!--  ===================================================================    Default templates for suppressing output if no more specific template exists  ===================================================================  -->  <!-- suppress text and attribute nodes not covered in subsequent template rule -->  <xsl:template match="text()|@*"/>  <!--  ===================================================================    Utility templates  ===================================================================  -->  <xsl:template match="parameters/label">    <p><xsl:value-of select="text()"/></p>  </xsl:template>  <!-- Add a tooltip property to a widget -->  <xsl:template match="description">    <property name="toolTip">      <string><xsl:value-of select="text()"/></string>    </property>  </xsl:template>  <!-- Set the default value by generating a Qt widget specific property which holds       the current value -->  <xsl:template match="default">    <property name="{ctk:mapTypeToQtValueProperty(name(..))}">      <xsl:element name="{ctk:mapTypeToXmlClass(name(..))}"><xsl:value-of select="text()"/></xsl:element>    </property>  </xsl:template>  <!-- Set Qt widget (spinbox) specific properties for applying constraints of scalar parameters -->  <xsl:template match="constraints/*[name()=('minimum','maximum')]">    <property name="{name()}">      <xsl:element name="{ctk:mapTypeToXmlClass(name(../..))}"><xsl:value-of select="text()"/></xsl:element>    </property>  </xsl:template>  <xsl:template match="constraints/step">    <property name="singleStep">      <xsl:element name="{ctk:mapTypeToXmlClass(name(../..))}"><xsl:value-of select="text()"/></xsl:element>    </property>    <!-- Also add the 'step' information under the original name -->    <property name="parameter:step">      <string><xsl:value-of select="text()"/></string>    </property>  </xsl:template>  <!-- A named template which will be called from each parameter (integer, float, image, etc.) element.       It assumes that it will be called from an enclosing Qt grid layout element and adds a label item -->  <xsl:template name="gridItemWithLabel">    <td><xsl:value-of select="./label"/></td>  </xsl:template>  <!-- A named template for adding properties common to all Qt widgets -->  <xsl:template name="commonWidgetProperties">    <xsl:apply-templates select="description"/> <!-- tooltip -->    <xsl:if test="@hidden='true'"> <!-- widget visibility -->      <property  name="visible">        <bool>false</bool>      </property>    </xsl:if>    <property name="parameter:valueProperty"> <!-- property name containing current value -->      <string><xsl:value-of select="ctk:mapTypeToQtValueProperty(name())"/></string>    </property>    <!-- add additional (optional) information as properties -->    <xsl:apply-templates select="default"/>  </xsl:template>  <!--  ===================================================================    Match elements from the XML description  ===================================================================  -->  <!-- start matching at 'executable' element -->  <xsl:template match="/executable">    <xsl:variable name="moduleTitle"><xsl:value-of select="title"/></xsl:variable>    <html>      <head>        <title><xsl:value-of select="title"/></title>      </head>      <body>        <form>        <div class="executable">          <!-- This will generate DIV elements with the specific widgets -->          <xsl:apply-templates select="parameters"/>        </div>        </form>      </body>    </html>  </xsl:template>  <!--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    Parameters  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->  <!-- Match the 'parameters' element and create the parameter groups (QGroupBox) -->  <xsl:template match="parameters">    <xsl:variable name="groupLabel"><xsl:value-of select="label"/></xsl:variable>    <div class="parameters">      <xsl:apply-templates select="./label"/>      <xsl:apply-templates select="./description"/>      <table>        <xsl:apply-templates select="./description/following-sibling::*"/>      </table>    </div>  </xsl:template>  <!--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    BOOLEAN parameter (default: QCheckbox)  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->  <xsl:template match="parameters/boolean">    <tr>      <xsl:call-template name="gridItemWithLabel"/>      <td><input type="checkbox" name="{name}"/></td>    </tr>  </xsl:template>    <!--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    IMAGE, FILE, GEOMETRY parameter (default: ctkPathLineEdit)  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->  <xsl:template match="parameters/*[name()=('image', 'file', 'geometry')]">    <tr>      <xsl:call-template name="gridItemWithLabel"/>      <td><input type="file" name="{name}"/></td>    </tr>  </xsl:template>    <!--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    DEFAULT  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  -->    <xsl:template match="parameters/*" priority="-1">    <tr>      <xsl:call-template name="gridItemWithLabel"/>      <td>        <input type="text" name="{name}">          <xsl:attribute name="value">            <xsl:value-of select="default/text()"/>          </xsl:attribute>        </input>      </td>    </tr>  </xsl:template></xsl:stylesheet>
 |