plcopen/variables_infos.xslt
changeset 1347 533741e5075c
parent 1324 884477877e53
child 1349 be6c3a036844
equal deleted inserted replaced
1346:92efd8fe3120 1347:533741e5075c
     1 <xsl:stylesheet version="1.0"
     1 <xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:dyn="http://exslt.org/dynamic" xmlns:str="http://exslt.org/strings" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="ns" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:yml="http://fdik.org/yml" xmlns:set="http://exslt.org/sets" version="1.0" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="var_infos_ns" exclude-result-prefixes="ns" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml"/><xsl:variable name="space" select="'                                                                                                                                                                                                        '"/><xsl:param name="autoindent" select="4"/><xsl:param name="tree"/><xsl:template match="text()"><xsl:param name="_indent" select="0"/></xsl:template><xsl:variable name="project"><xsl:choose><xsl:when test="$tree='True'"><xsl:copy-of select="document('project')/project/*"/></xsl:when></xsl:choose></xsl:variable><xsl:variable name="stdlib"><xsl:choose><xsl:when test="$tree='True'"><xsl:copy-of select="document('stdlib')/stdlib/*"/></xsl:when></xsl:choose></xsl:variable><xsl:variable name="extensions"><xsl:choose><xsl:when test="$tree='True'"><xsl:copy-of select="document('extensions')/extensions/*"/></xsl:when></xsl:choose></xsl:variable><xsl:template match="ppx:returnType"><xsl:param name="_indent" select="0"/><xsl:value-of select="ns:AddTree()"/><xsl:apply-templates><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:template><xsl:template name="variables_infos"><xsl:param name="_indent" select="0"/><xsl:param name="var_class"/><xsl:variable name="var_option"><xsl:choose><xsl:when test="@constant='true' or @constant='1'"><xsl:text>Constant</xsl:text></xsl:when><xsl:when test="@retain='true' or @retain='1'"><xsl:text>Retain</xsl:text></xsl:when><xsl:when test="@nonretain='true' or @nonretain='1'"><xsl:text>Non-Retain</xsl:text></xsl:when></xsl:choose></xsl:variable><xsl:for-each select="ppx:variable"><xsl:variable name="initial_value"><xsl:apply-templates select="ppx:initialValue"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:variable><xsl:variable name="edit"><xsl:choose><xsl:when test="$var_class='Global' or $var_class='External'"><xsl:text>true</xsl:text></xsl:when><xsl:otherwise><xsl:apply-templates mode="var_edit" select="ppx:type"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:otherwise></xsl:choose></xsl:variable><xsl:value-of select="ns:AddTree()"/><xsl:apply-templates select="ppx:type"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates><xsl:value-of select="ns:AddVariable(@name, $var_class, $var_option, @address, $initial_value, $edit, ppx:documentation/xhtml:p/text())"/></xsl:for-each></xsl:template><xsl:template match="ppx:localVars"><xsl:param name="_indent" select="0"/><xsl:call-template name="variables_infos"><xsl:with-param name="var_class"><xsl:text>Local</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:globalVars"><xsl:param name="_indent" select="0"/><xsl:call-template name="variables_infos"><xsl:with-param name="var_class"><xsl:text>Global</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:externalVars"><xsl:param name="_indent" select="0"/><xsl:call-template name="variables_infos"><xsl:with-param name="var_class"><xsl:text>External</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:tempVars"><xsl:param name="_indent" select="0"/><xsl:call-template name="variables_infos"><xsl:with-param name="var_class"><xsl:text>Temp</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:inputVars"><xsl:param name="_indent" select="0"/><xsl:call-template name="variables_infos"><xsl:with-param name="var_class"><xsl:text>Input</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:outputVars"><xsl:param name="_indent" select="0"/><xsl:call-template name="variables_infos"><xsl:with-param name="var_class"><xsl:text>Output</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:inOutVars"><xsl:param name="_indent" select="0"/><xsl:call-template name="variables_infos"><xsl:with-param name="var_class"><xsl:text>InOut</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:pou"><xsl:param name="_indent" select="0"/><xsl:apply-templates select="ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars or self::ppx:outputVars]/ppx:variable"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:template><xsl:template match="ppx:variable"><xsl:param name="_indent" select="0"/><xsl:variable name="name"><xsl:value-of select="@name"/></xsl:variable><xsl:value-of select="ns:AddTree($name)"/><xsl:apply-templates select="ppx:type"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates><xsl:value-of select="ns:AddVarToTree($name)"/></xsl:template><xsl:template match="ppx:dataType"><xsl:param name="_indent" select="0"/><xsl:apply-templates select="ppx:baseType"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:template><xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:struct"><xsl:param name="_indent" select="0"/><xsl:apply-templates select="ppx:variable"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:template><xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived"><xsl:param name="_indent" select="0"/><xsl:variable name="type_name"><xsl:value-of select="@name"/></xsl:variable><xsl:choose><xsl:when test="$tree='True'"><xsl:apply-templates select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:when></xsl:choose><xsl:value-of select="ns:SetType($type_name)"/></xsl:template><xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:array"><xsl:param name="_indent" select="0"/><xsl:apply-templates select="ppx:baseType"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates><xsl:for-each select="ppx:dimension"><xsl:value-of select="ns:AddDimension(@lower, @upper)"/></xsl:for-each></xsl:template><xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string"><xsl:param name="_indent" select="0"/><xsl:variable name="name"><xsl:text>STRING</xsl:text></xsl:variable><xsl:value-of select="ns:SetType($name)"/></xsl:template><xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring"><xsl:param name="_indent" select="0"/><xsl:variable name="name"><xsl:text>WSTRING</xsl:text></xsl:variable><xsl:value-of select="ns:SetType($name)"/></xsl:template><xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*"><xsl:param name="_indent" select="0"/><xsl:variable name="name"><xsl:value-of select="local-name()"/></xsl:variable><xsl:value-of select="ns:SetType($name)"/></xsl:template><xsl:template mode="var_edit" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived"><xsl:param name="_indent" select="0"/><xsl:variable name="type_name" select="@name"/><xsl:variable name="pou_infos"><xsl:copy-of select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"/></xsl:variable><xsl:choose><xsl:when test="$pou_infos != ''"><xsl:text>false</xsl:text></xsl:when><xsl:otherwise><xsl:text>true</xsl:text></xsl:otherwise></xsl:choose></xsl:template><xsl:template mode="var_edit" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*"><xsl:param name="_indent" select="0"/><xsl:text>true</xsl:text></xsl:template><xsl:template match="ppx:value"><xsl:param name="_indent" select="0"/><xsl:choose><xsl:when test="@repetitionValue"><xsl:value-of select="@repetitionValue"/><xsl:text>(</xsl:text><xsl:apply-templates><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates><xsl:text>)</xsl:text></xsl:when><xsl:when test="@member"><xsl:value-of select="@member"/><xsl:text> := </xsl:text><xsl:apply-templates><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:when><xsl:otherwise><xsl:apply-templates><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates></xsl:otherwise></xsl:choose></xsl:template><xsl:template match="ppx:simpleValue"><xsl:param name="_indent" select="0"/><xsl:value-of select="@value"/></xsl:template><xsl:template name="complex_type_value"><xsl:param name="_indent" select="0"/><xsl:param name="start_bracket"/><xsl:param name="end_bracket"/><xsl:value-of select="@start_bracket"/><xsl:for-each select="ppx:value"><xsl:apply-templates select="."><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates><xsl:choose><xsl:when test="position()!=last()"><xsl:text>, </xsl:text></xsl:when></xsl:choose></xsl:for-each><xsl:value-of select="@end_bracket"/></xsl:template><xsl:template match="ppx:arrayValue"><xsl:param name="_indent" select="0"/><xsl:call-template name="complex_type_value"><xsl:with-param name="start_bracket"><xsl:text>[</xsl:text></xsl:with-param><xsl:with-param name="end_bracket"><xsl:text>]</xsl:text></xsl:with-param></xsl:call-template></xsl:template><xsl:template match="ppx:structValue"><xsl:param name="_indent" select="0"/><xsl:call-template name="complex_type_value"><xsl:with-param name="start_bracket"><xsl:text>(</xsl:text></xsl:with-param><xsl:with-param name="end_bracket"><xsl:text>)</xsl:text></xsl:with-param></xsl:call-template></xsl:template></xsl:stylesheet>
     2     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       
     3     xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
       
     4     xmlns:xhtml="http://www.w3.org/1999/xhtml"
       
     5     xmlns:ns="var_infos_ns"
       
     6     extension-element-prefixes="ns"
       
     7     exclude-result-prefixes="ns">
       
     8   <xsl:template match="ppx:returnType">
       
     9     <ReturnType>
       
    10       <Type><xsl:apply-templates/></Type>
       
    11       <Tree><xsl:apply-templates mode="var_tree"/></Tree>
       
    12     </ReturnType>
       
    13   </xsl:template>
       
    14   <xsl:template match="ppx:localVars">
       
    15     <xsl:call-template name="variables_infos">
       
    16       <xsl:with-param name="var_class" select="'Local'"/>
       
    17     </xsl:call-template>
       
    18   </xsl:template>
       
    19   <xsl:template match="ppx:globalVars">
       
    20     <xsl:call-template name="variables_infos">
       
    21       <xsl:with-param name="var_class" select="'Global'"/>
       
    22     </xsl:call-template>
       
    23   </xsl:template>
       
    24   <xsl:template match="ppx:externalVars">
       
    25     <xsl:call-template name="variables_infos">
       
    26       <xsl:with-param name="var_class" select="'External'"/>
       
    27     </xsl:call-template>
       
    28   </xsl:template>
       
    29   <xsl:template match="ppx:tempVars">
       
    30     <xsl:call-template name="variables_infos">
       
    31       <xsl:with-param name="var_class" select="'Temp'"/>
       
    32     </xsl:call-template>
       
    33   </xsl:template>
       
    34   <xsl:template match="ppx:inputVars">
       
    35     <xsl:call-template name="variables_infos">
       
    36       <xsl:with-param name="var_class" select="'Input'"/>
       
    37     </xsl:call-template>
       
    38   </xsl:template>
       
    39   <xsl:template match="ppx:outputVars">
       
    40     <xsl:call-template name="variables_infos">
       
    41       <xsl:with-param name="var_class" select="'Output'"/>
       
    42     </xsl:call-template>
       
    43   </xsl:template>
       
    44   <xsl:template match="ppx:inOutVars">
       
    45     <xsl:call-template name="variables_infos">
       
    46       <xsl:with-param name="var_class" select="'InOut'"/>
       
    47     </xsl:call-template>
       
    48   </xsl:template>
       
    49   <xsl:template name="variables_infos">
       
    50     <xsl:param name="var_class"/>
       
    51     <xsl:variable name="var_option">
       
    52       <xsl:choose>
       
    53         <xsl:when test="@constant='true' or @constant='1'">
       
    54           <xsl:text>Constant</xsl:text>
       
    55         </xsl:when>
       
    56         <xsl:when test="@retain='true' or @retain='1'">
       
    57           <xsl:text>Retain</xsl:text>
       
    58         </xsl:when>
       
    59         <xsl:when test="@nonretain='true' or @nonretain='1'">
       
    60           <xsl:text>Non-Retain</xsl:text>
       
    61         </xsl:when>
       
    62       </xsl:choose>
       
    63     </xsl:variable>
       
    64     <xsl:for-each select="ppx:variable">
       
    65       <ns:add_variable>
       
    66         <Name><xsl:value-of select="@name"/></Name>
       
    67         <Class><xsl:value-of select="$var_class"/></Class>
       
    68         <Type><xsl:apply-templates select="ppx:type"/></Type>
       
    69         <Option><xsl:value-of select="$var_option"/></Option>
       
    70         <Location><xsl:value-of select="@address"/></Location>
       
    71         <Initial_Value><xsl:apply-templates select="ppx:initialValue"/></Initial_Value>
       
    72         <Edit><xsl:apply-templates select="ppx:type" mode="var_edit"/></Edit>
       
    73         <Tree><xsl:apply-templates select="ppx:type" mode="var_tree"/></Tree>
       
    74         <Documentation>
       
    75           <xsl:value-of select="ppx:documentation/xhtml:p/text()"/>
       
    76         </Documentation>
       
    77       </ns:add_variable>
       
    78     </xsl:for-each>
       
    79   </xsl:template>
       
    80   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived">
       
    81     <xsl:value-of select="@name"/>
       
    82   </xsl:template>
       
    83   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:array">
       
    84     <array>
       
    85       <xsl:apply-templates select="ppx:baseType"/>
       
    86       <xsl:for-each select="ppx:dimension">
       
    87         <dimension>
       
    88           <xsl:attribute name="lower">
       
    89             <xsl:value-of select="@lower"/>
       
    90           </xsl:attribute>
       
    91           <xsl:attribute name="upper">
       
    92             <xsl:value-of select="@upper"/>
       
    93           </xsl:attribute>
       
    94         </dimension>
       
    95       </xsl:for-each>
       
    96     </array>
       
    97   </xsl:template>
       
    98   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string">
       
    99     <xsl:text>STRING</xsl:text>
       
   100   </xsl:template>
       
   101   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring">
       
   102     <xsl:text>WSTRING</xsl:text>
       
   103   </xsl:template>
       
   104   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*">
       
   105     <xsl:value-of select="local-name()"/>
       
   106   </xsl:template>
       
   107   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived" mode="var_edit">
       
   108     <ns:is_edited/>
       
   109   </xsl:template>
       
   110   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*" mode="var_edit">
       
   111     <xsl:text>True</xsl:text>
       
   112   </xsl:template>
       
   113   <xsl:template match="ppx:initialValue">
       
   114     <xsl:apply-templates/>
       
   115   </xsl:template>
       
   116   <xsl:template match="ppx:value">
       
   117     <xsl:choose>
       
   118       <xsl:when test="@repetitionValue">
       
   119         <xsl:value-of select="@repetitionValue"/>
       
   120         <xsl:text>(</xsl:text>
       
   121         <xsl:apply-templates/>
       
   122         <xsl:text>)</xsl:text>
       
   123       </xsl:when>
       
   124       <xsl:when test="@member">
       
   125         <xsl:value-of select="@member"/>
       
   126         <xsl:text> := </xsl:text>
       
   127         <xsl:apply-templates/>
       
   128       </xsl:when>
       
   129       <xsl:otherwise>
       
   130         <xsl:apply-templates/>
       
   131       </xsl:otherwise>
       
   132     </xsl:choose>
       
   133   </xsl:template>
       
   134   <xsl:template match="ppx:simpleValue">
       
   135     <xsl:value-of select="@value"/>
       
   136   </xsl:template>
       
   137   <xsl:template match="ppx:arrayValue">
       
   138     <xsl:text>[</xsl:text>
       
   139     <xsl:for-each select="ppx:value">
       
   140       <xsl:apply-templates select="."/>
       
   141       <xsl:choose>
       
   142         <xsl:when test="position()!=last()">
       
   143           <xsl:text>, </xsl:text>
       
   144         </xsl:when>
       
   145       </xsl:choose>
       
   146     </xsl:for-each>
       
   147     <xsl:text>]</xsl:text>
       
   148   </xsl:template>
       
   149   <xsl:template match="ppx:structValue">
       
   150     <xsl:text>(</xsl:text>
       
   151     <xsl:for-each select="ppx:value">
       
   152       <xsl:apply-templates select="."/>
       
   153       <xsl:choose>
       
   154         <xsl:when test="position()!=last()">
       
   155           <xsl:text>, </xsl:text>
       
   156         </xsl:when>
       
   157       </xsl:choose>
       
   158     </xsl:for-each>
       
   159     <xsl:text>)</xsl:text>
       
   160   </xsl:template>
       
   161   <xsl:template match="ppx:pou" mode="var_tree">
       
   162     <xsl:apply-templates select="ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars or self::ppx:outputVars]/ppx:variable" mode="var_tree"/>
       
   163   </xsl:template>
       
   164   <xsl:template match="ppx:variable" mode="var_tree">
       
   165     <var>
       
   166       <xsl:attribute name="name">
       
   167         <xsl:value-of select="@name"/>
       
   168       </xsl:attribute>
       
   169       <xsl:apply-templates select="ppx:type" mode="var_tree"/>
       
   170     </var>
       
   171   </xsl:template>
       
   172   <xsl:template match="ppx:dataType">
       
   173     <xsl:apply-templates select="ppx:baseType" mode="var_tree"/>
       
   174   </xsl:template>
       
   175   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:struct" mode="var_tree">
       
   176     <xsl:apply-templates select="ppx:variable" mode="var_tree"/>
       
   177   </xsl:template>
       
   178   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived" mode="var_tree">
       
   179     <ns:var_tree/>
       
   180     <xsl:choose>
       
   181       <xsl:when test="count(./*) > 0">
       
   182         <xsl:apply-templates mode="var_tree"/>
       
   183       </xsl:when>
       
   184       <xsl:otherwise>
       
   185         <xsl:value-of select="@name"/>
       
   186       </xsl:otherwise>
       
   187     </xsl:choose>
       
   188   </xsl:template>
       
   189   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:array" mode="var_tree">
       
   190     <xsl:apply-templates select="ppx:baseType" mode="var_tree"/>
       
   191     <xsl:for-each select="ppx:dimension">
       
   192       <dimension>
       
   193         <xsl:attribute name="lower">
       
   194           <xsl:value-of select="@lower"/>
       
   195         </xsl:attribute>
       
   196         <xsl:attribute name="upper">
       
   197           <xsl:value-of select="@upper"/>
       
   198         </xsl:attribute>
       
   199       </dimension>
       
   200     </xsl:for-each>
       
   201   </xsl:template>
       
   202   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string" mode="var_tree">
       
   203     <xsl:text>STRING</xsl:text>
       
   204   </xsl:template>
       
   205   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring" mode="var_tree">
       
   206     <xsl:text>WSTRING</xsl:text>
       
   207   </xsl:template>
       
   208   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*" mode="var_tree">
       
   209     <xsl:value-of select="local-name()"/>
       
   210   </xsl:template>
       
   211   <xsl:template match="text()"/>
       
   212   <xsl:template match="text()" mode="var_tree"/>
       
   213 </xsl:stylesheet>