plcopen/pou_variables.ysl2
changeset 1348 aee0a7eb833a
child 1936 b85b13b1c2ec
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/pou_variables.ysl2	Wed Oct 09 22:00:23 2013 +0200
@@ -0,0 +1,279 @@
+include yslt.yml2
+estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
+            xmlns:xhtml="http://www.w3.org/1999/xhtml"
+            xmlns:ns="pou_vars_ns" 
+            extension-element-prefixes="ns" 
+            exclude-result-prefixes="ns" {
+    
+    template "text()";
+    template "text()", mode="var_class";
+    template "text()", mode="var_type";
+    template "text()", mode="var_edit";
+    template "text()", mode="var_debug";
+    
+    variable "project" {
+        copy "document('project')/project/*";
+    }
+    
+    variable "stdlib" {
+        copy "document('stdlib')/stdlib/*";
+    }
+    variable "extensions" {
+        copy "document('extensions')/extensions/*";
+    }
+    
+    function "add_root" {
+        param "class";
+        param "type";
+        param "edit" > true
+        param "debug" > true
+        value "ns:SetRoot($class, $type, $edit, $debug)";
+    }
+    
+    template "ppx:pou" {
+        call "add_root" {
+            with "class" > «@pouType»
+            with "type" > «@name»
+        }
+        apply "ppx:interface";
+        apply "ppx:actions/ppx:action | ppx:transitions/ppx:transition", mode="variable_list";
+    }
+    
+    template "ppx:action" {
+        call "add_root" {
+            with "class" > action
+        }
+        apply "ancestor::ppx:pou/child::ppx:interface";
+    }
+    
+    template "ppx:transition" {
+        call "add_root" {
+            with "class" > transition
+        }
+        apply "ancestor::ppx:pou/child::ppx:interface";
+    }
+    
+    template "ppx:configuration" {
+        call "add_root" {
+            with "class" > configuration
+            with "debug" > false
+        }
+        apply "ppx:resource", mode="variable_list";
+        apply "ppx:globalVars";
+    }
+    
+    template "ppx:resource" {
+        call "add_root" {
+            with "class" > resource
+            with "debug" > false
+        }
+        apply "ppx:pouInstance | ppx:task/ppx:pouInstance",  mode="variable_list";
+        apply "ppx:globalVars";
+    }
+    
+    function "variables_infos" {
+        param "var_class";
+        foreach "ppx:variable" {
+            variable "class" {
+                apply "ppx:type", mode="var_class" {
+                    with "default_class" > «$var_class»
+                }
+            }
+            variable "type" {
+                apply"ppx:type", mode="var_type";
+            }
+            variable "edit" {
+                apply "ppx:type", mode="var_edit";
+            }
+            variable "debug" {
+                apply "ppx:type", mode="var_debug";
+            }
+            value "ns:AddVariable(@name, $class, $type, $edit, $debug)";
+        }
+    }
+    
+    template "ppx:localVars" {
+        call "variables_infos" {
+            with "var_class" > Local
+        }
+    }
+    
+    template "ppx:globalVars" {
+        call "variables_infos" {
+            with "var_class" > Global
+        }
+    }
+    
+    template "ppx:externalVars" {
+        call "variables_infos" {
+            with "var_class" > External
+        }
+    }
+    
+    template "ppx:tempVars" {
+        call "variables_infos" {
+            with "var_class" > Temp
+        }
+    }
+    
+    template "ppx:inputVars" {
+        call "variables_infos" {
+            with "var_class" > Input
+        }
+    }
+    
+    template "ppx:outputVars" {
+        call "variables_infos" {
+            with "var_class" > Output
+        }
+    }
+    
+    template "ppx:inOutVars" {
+        call "variables_infos" {
+            with "var_class" > InOut
+        }
+    }
+    
+    function "add_variable" {
+        param "name";
+        param "class";
+        param "type";
+        param "edit" > true
+        param "debug" > true
+        value "ns:AddVariable($name, $class, $type, $edit, $debug)";
+    }
+    
+    template "ppx:action", mode="variable_list" {
+        call "add_variable" {
+            with "name" > «@name»
+            with "class" > action
+        }
+    }
+    
+    template "ppx:transition", mode="variable_list" {
+        call "add_variable" {
+            with "name" > «@name»
+            with "class" > transition
+        }
+    }
+    
+    template "ppx:resource", mode="variable_list" {
+        call "add_variable" {
+            with "name" > «@name»
+            with "class" > resource
+            with "debug" > false
+        } 
+    }
+    
+    template "ppx:pouInstance", mode="variable_list" {
+        call "add_variable" {
+            with "name" > «@name»
+            with "class" > program
+            with "type" > «@typeName»
+        }
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_class" {
+        param "default_class";
+        variable "type_name", "@name";
+        variable "pou_infos" {
+            copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
+                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
+                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]""";
+        }
+        choose {
+            when "$pou_infos != ''" {
+                apply "exsl:node-set($pou_infos)", mode="var_class";
+            }
+            otherwise {
+                value "$default_class"
+            }
+        }
+    }
+    
+    template "ppx:pou", mode="var_class" {
+        value "@pouType";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/*" mode="var_class" {
+        param "default_class";
+        value "$default_class";
+    }
+  
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_type" {
+        > «@name»
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_type" {
+        > ARRAY [
+        foreach "ppx:dimension" {
+            > «@lower»..«@upper»
+        }
+        > ] OF 
+        apply "ppx:baseType", mode="var_type";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:string", mode="var_type" {
+        > STRING
+    }
+  
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:wstring", mode="var_type" {
+        > WSTRING
+    }
+  
+    template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_type" {
+        > «local-name()»
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_edit" {
+        variable "type_name", "@name";
+        variable "pou_infos" {
+            copy "exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]";
+        }
+        choose {
+            when "$pou_infos != ''" > true
+            otherwise > false
+        }
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_edit" {
+        apply "ppx:baseType", mode="var_edit";
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_edit" {
+        > false
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_debug" {
+        variable "type_name", "@name";
+        variable "datatype_infos" {
+            copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
+                    exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
+                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
+                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""";
+        }
+        choose {
+            when "$datatype_infos != ''" {
+                apply "exsl:node-set($datatype_infos)", mode="var_debug";
+            }
+            otherwise > false
+        }
+    }
+    
+    template "ppx:pou", mode="var_debug" {
+        > true
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:array", mode="var_debug" {
+        > false
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/ppx:struct", mode="var_debug" {
+        > false
+    }
+    
+    template "*[self::ppx:type or self::ppx:baseType]/*", mode="var_debug" {
+        > true
+    }
+    
+}