--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/pou_variables.ysl2 Mon Nov 18 12:12:31 2013 +0900
@@ -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
+ }
+
+}