plcopen/pou_variables.xslt
author Laurent Bessard
Wed, 18 Sep 2013 15:30:46 +0200
changeset 1319 748347102c97
parent 1316 df9d02bd3eb7
child 1348 aee0a7eb833a
permissions -rw-r--r--
Replaced old list of pou instance in project generating process by xslt stylesheet
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
    xmlns:ns="pou_vars_ns"
    extension-element-prefixes="ns"
    exclude-result-prefixes="ns">
  <xsl:template match="ppx:pou">
    <pou>
      <class><xsl:value-of select="@pouType"/></class>
      <type><xsl:value-of select="@name"/></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>True</xsl:text></debug>
      <variables>
        <xsl:apply-templates select="ppx:interface"/>
        <xsl:apply-templates select="ppx:actions/ppx:action | ppx:transitions/ppx:transition" mode="variable_list"/>
      </variables>
    </pou>
  </xsl:template>
  <xsl:template match="ppx:action">
    <action>
      <class/>
      <type><xsl:text>None</xsl:text></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>True</xsl:text></debug>
      <variables>
        <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface"/>
      </variables>
    </action>
  </xsl:template>
  <xsl:template match="ppx:transition">
    <transition>
      <class/>
      <type><xsl:text>None</xsl:text></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>True</xsl:text></debug>
      <variables>
        <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface"/>
      </variables>
    </transition>
  </xsl:template>
  <xsl:template match="ppx:configuration">
    <configuration>
      <class/>
      <type><xsl:text>None</xsl:text></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>False</xsl:text></debug>
      <variables>
        <xsl:apply-templates select="ppx:resource" mode="variable_list"/>
        <xsl:apply-templates select="ppx:globalVars"/>
      </variables>
    </configuration>
  </xsl:template>
  <xsl:template match="ppx:resource">
    <resource>
      <class/>
      <type><xsl:text>None</xsl:text></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>False</xsl:text></debug>
      <variables>
        <xsl:apply-templates select="ppx:pouInstance | ppx:task/ppx:pouInstance" mode="variable_list"/>
        <xsl:apply-templates select="ppx:globalVars"/>
      </variables>
    </resource>
  </xsl:template>
  <xsl:template match="ppx:localVars">
    <xsl:call-template name="variables_infos">
      <xsl:with-param name="var_class" select="'Local'"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template match="ppx:globalVars">
    <xsl:call-template name="variables_infos">
      <xsl:with-param name="var_class" select="'Global'"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template match="ppx:externalVars">
    <xsl:call-template name="variables_infos">
      <xsl:with-param name="var_class" select="'External'"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template match="ppx:tempVars">
    <xsl:call-template name="variables_infos">
      <xsl:with-param name="var_class" select="'Temp'"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template match="ppx:inputVars">
    <xsl:call-template name="variables_infos">
      <xsl:with-param name="var_class" select="'Input'"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template match="ppx:outputVars">
    <xsl:call-template name="variables_infos">
      <xsl:with-param name="var_class" select="'Output'"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template match="ppx:inOutVars">
    <xsl:call-template name="variables_infos">
      <xsl:with-param name="var_class" select="'InOut'"/>
    </xsl:call-template>
  </xsl:template>
  <xsl:template name="variables_infos">
    <xsl:param name="var_class"/>
	<xsl:for-each select="ppx:variable">
      <variable>
	    <name><xsl:value-of select="@name"/></name>
	    <class>
	      <xsl:apply-templates mode="var_class">
	        <xsl:with-param name="default_class">
	          <xsl:value-of select="$var_class"/>
	        </xsl:with-param>
	      </xsl:apply-templates>
	    </class>
	    <type><xsl:apply-templates mode="var_type"/></type>
	    <edit><xsl:apply-templates mode="var_edit"/></edit>
	    <debug><xsl:apply-templates mode="var_debug"/></debug>
      </variable>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="ppx:transition" mode="variable_list">
    <transition>
      <name><xsl:value-of select="@name"/></name>
      <class/>
      <type><xsl:text>None</xsl:text></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>True</xsl:text></debug>
    </transition>
  </xsl:template>
  <xsl:template match="ppx:action" mode="variable_list">
    <action>
	  <name><xsl:value-of select="@name"/></name>
	  <class/>
      <type><xsl:text>None</xsl:text></type>
	  <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>True</xsl:text></debug>
    </action>
  </xsl:template>
  <xsl:template match="ppx:resource" mode="variable_list">
    <resource>
      <name><xsl:value-of select="@name"/></name>
      <class/>
      <type><xsl:text>None</xsl:text></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>False</xsl:text></debug>
    </resource>
  </xsl:template>
  <xsl:template match="ppx:pouInstance" mode="variable_list">
    <program>
      <name><xsl:value-of select="@name"/></name>
      <class/>
      <type><xsl:value-of select="@typeName"/></type>
      <edit><xsl:text>True</xsl:text></edit>
      <debug><xsl:text>True</xsl:text></debug>
    </program>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:derived" mode="var_class">
    <xsl:param name="default_class"/>
    <ns:pou_class>
      <xsl:value-of select="$default_class"/>
    </ns:pou_class>
  </xsl:template>
  <xsl:template match="ppx:pou" mode="var_class">
    <xsl:param name="default_class"/>
    <xsl:value-of select="@pouType"/>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/*" mode="var_class">
    <xsl:param name="default_class"/>
    <xsl:value-of select="$default_class"/>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:derived" mode="var_type">
    <xsl:value-of select="@name"/>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:array" mode="var_type">
    <xsl:text>ARRAY [</xsl:text>
    <xsl:for-each select="ppx:dimension">
      <xsl:value-of select="@lower"/>
      <xsl:text>..</xsl:text>
      <xsl:value-of select="@upper"/>
    </xsl:for-each>
    <xsl:text>] OF </xsl:text>
    <xsl:apply-templates select="ppx:baseType" mode="var_type"/>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:string" mode="var_type">
    <xsl:text>STRING</xsl:text>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:wstring" mode="var_type">
    <xsl:text>WSTRING</xsl:text>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/*" mode="var_type">
    <xsl:value-of select="local-name()"/>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:derived" mode="var_edit">
    <ns:is_edited/>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:array" mode="var_edit">
    <xsl:apply-templates select="ppx:baseType" mode="var_edit"/>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/*" mode="var_edit">
    <xsl:text>False</xsl:text>
  </xsl:template>
    <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:derived" mode="var_debug">
    <ns:is_debugged/>
  </xsl:template>
  <xsl:template match="ppx:pou" mode="var_debug">
    <xsl:text>True</xsl:text>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:array" mode="var_debug">
    <xsl:text>False</xsl:text>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/ppx:struct" mode="var_debug">
    <xsl:text>False</xsl:text>
  </xsl:template>
  <xsl:template match="*[self::ppx:type or self::ppx:baseType]/*" mode="var_debug">
    <xsl:text>True</xsl:text>
  </xsl:template>
  <xsl:template match="text()"/>
  <xsl:template match="text()" mode="var_class"/>
  <xsl:template match="text()" mode="var_type"/>
  <xsl:template match="text()" mode="var_edit"/>
  <xsl:template match="text()" mode="var_debug"/>
</xsl:stylesheet>