# HG changeset patch # User Laurent Bessard # Date 1381391032 -7200 # Node ID a546a63ce1bfa374cded3149979a455334f6cef1 # Parent 7280349a3375b5497ccc3dfeedc0a541c216d7fc Fixed pou tagname of instance path computing stylesheet diff -r 7280349a3375 -r a546a63ce1bf PLCControler.py --- a/PLCControler.py Wed Oct 09 23:06:47 2013 +0200 +++ b/PLCControler.py Thu Oct 10 09:43:52 2013 +0200 @@ -254,55 +254,30 @@ # Helpers object for generating instance tagname #------------------------------------------------------------------------------- -class InstanceTagName(etree.XSLTExtension): +class InstanceTagName: def __init__(self, controller): - etree.XSLTExtension.__init__(self) self.Controller = controller - - def GetTagName(self, infos): - return "" - - def execute(self, context, self_node, input_node, output_parent): - tagname_infos = etree.Element('infos') - self.process_children(context, tagname_infos) - tagname = etree.Element('tagname') - tagname.text = self.GetTagName(tagname_infos) - try: - output_parent.append(tagname) - except: - pass - -class ConfigTagName(InstanceTagName): - - def GetTagName(self, infos): - return self.Controller.ComputeConfigurationName(infos.get("name")) - -class ResourceTagName(InstanceTagName): - - def GetTagName(self, infos): - return self.Controller.ComputeConfigurationResourceName( - infos.get("config_name"), infos.get("name")) - -class PouTagName(InstanceTagName): - - def GetTagName(self, infos): - return self.Controller.ComputePouName(infos.get("name")) - -class ActionTagName(InstanceTagName): - - def GetTagName(self, infos): - return self.Controller.ComputePouActionName( - infos.get("pou_name"), infos.get("name")) - -class TransitionTagName(InstanceTagName): - - def GetTagName(self, infos): - return self.Controller.ComputePouTransitionName( - infos.get("pou_name"), infos.get("name")) - -instance_tagname_xslt = etree.parse( - os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt")) + self.TagName = None + + def GetTagName(self): + return self.TagName + + def ConfigTagName(self, context, *args): + self.TagName = self.Controller.ComputeConfigurationName(args[0][0]) + + def ResourceTagName(self, context, *args): + self.TagName = self.Controller.ComputeConfigurationResourceName(args[0][0], args[1][0]) + + def PouTagName(self, context, *args): + #print "PouTagName", etree.tostring(args[0][0]) + self.TagName = self.Controller.ComputePouName(args[0][0]) + + def ActionTagName(self, context, *args): + self.TagName = self.Controller.ComputePouActionName(args[0][0], args[0][1]) + + def TransitionTagName(self, context, *args): + self.TagName = self.Controller.ComputePouTransitionName(args[0][0], args[0][1]) #------------------------------------------------------------------------------- # Helpers object for generating pou block instances list @@ -812,23 +787,24 @@ def GetPouInstanceTagName(self, instance_path, debug = False): project = self.GetProject(debug) + factory = InstanceTagName(self) + + parser = etree.XMLParser() + parser.resolvers.add(LibraryResolver(self, debug)) instance_tagname_xslt_tree = etree.XSLT( - instance_tagname_xslt, - extensions = { - ("instance_tagname_ns", "instance_definition"): InstanceDefinition(self, debug), - ("instance_tagname_ns", "config_tagname"): ConfigTagName(self), - ("instance_tagname_ns", "resource_tagname"): ResourceTagName(self), - ("instance_tagname_ns", "pou_tagname"): PouTagName(self), - ("instance_tagname_ns", "action_tagname"): ActionTagName(self), - ("instance_tagname_ns", "transition_tagname"): TransitionTagName(self)}) - - result = instance_tagname_xslt_tree(project, - instance_path=etree.XSLT.strparam(instance_path)).getroot() - if result is not None: - return result.text - - return None + etree.parse( + os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt"), + parser), + extensions = {("instance_tagname_ns", name): getattr(factory, name) + for name in ["ConfigTagName", "ResourceTagName", + "PouTagName", "ActionTagName", + "TransitionTagName"]}) + + instance_tagname_xslt_tree(project, + instance_path=etree.XSLT.strparam(instance_path)) + + return factory.GetTagName() def GetInstanceInfos(self, instance_path, debug = False): tagname = self.GetPouInstanceTagName(instance_path) diff -r 7280349a3375 -r a546a63ce1bf plcopen/instance_tagname.xslt --- a/plcopen/instance_tagname.xslt Wed Oct 09 23:06:47 2013 +0200 +++ b/plcopen/instance_tagname.xslt Thu Oct 10 09:43:52 2013 +0200 @@ -1,12 +1,20 @@ - + + + + + + + + + + + + + + + @@ -18,6 +26,7 @@ + @@ -26,12 +35,14 @@ + + @@ -40,41 +51,17 @@ + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -83,123 +70,127 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff -r 7280349a3375 -r a546a63ce1bf plcopen/instance_tagname.ysl2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plcopen/instance_tagname.ysl2 Thu Oct 10 09:43:52 2013 +0200 @@ -0,0 +1,186 @@ +include yslt.yml2 +estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" + xmlns:xhtml="http://www.w3.org/1999/xhtml" + xmlns:ns="instance_tagname_ns" + extension-element-prefixes="ns" + exclude-result-prefixes="ns" { + + param "instance_path"; + + variable "project" { + copy "document('project')/project/*"; + } + + variable "stdlib" { + copy "document('stdlib')/stdlib/*"; + } + variable "extensions" { + copy "document('extensions')/extensions/*"; + } + + function "element_name" { + param "path"; + choose { + when "contains($path,'.')" > «substring-before($path,'.')» + otherwise > «$path» + } + } + + function "next_path" { + param "path"; + choose { + when "contains($path,'.')" > «substring-after($path,'.')» + } + } + + template "ppx:project" { + variable "config_name" { + call "element_name" { + with "path", "$instance_path"; + } + } + apply "ppx:instances/ppx:configurations/ppx:configuration[@name=$config_name]" { + with "element_path" { + call "next_path" { + with "path", "$instance_path"; + } + } + } + } + + template "ppx:configuration" { + param "element_path"; + choose { + when "$element_path!=''" { + variable "child_name" { + call "element_name" { + with "path", "$element_path"; + } + } + apply "ppx:resource[@name=$child_name] | ppx:globalVars/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" { + with "element_path" { + call "next_path" { + with "path", "$element_path"; + } + } + } + } + otherwise { + value "ns:ConfigTagName(@name)"; + } + } + } + + template "ppx:resource" { + param "element_path"; + choose { + when "$element_path!=''" { + variable "child_name" { + call "element_name" { + with "path" > «$element_path» + } + } + apply "ppx:pouInstance[@name=$child_name] | ppx:task/ppx:pouInstance[@name=$child_name] | ppx:globalVars/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" { + with "element_path" { + call "next_path" { + with "path", "$element_path"; + } + } + } + } + otherwise { + value "ns:ResourceTagName(ancestor::ppx:configuration/@name, @name)"; + } + } + } + + template "ppx:pouInstance" { + param "element_path"; + variable "type_name" > «@typeName» + apply """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:pous/ppx:pou[@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:pous/ppx:pou[@name=$type_name] | + exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" { + with "element_path", "$element_path"; + } + } + + template "ppx:pou" { + param "element_path"; + choose { + when "$element_path!=''" { + variable "child_name" { + call "element_name" { + with "path", "$element_path"; + } + } + apply "ppx:interface/*/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" { + with "element_path" { + call "next_path" { + with "path", "$element_path"; + } + } + } + apply "ppx:actions/ppx:action[@name=$child_name] | ppx:transitions/ppx:transition[@name=$child_name]"; + } + otherwise { + variable "name" > «@name» + value "ns:PouTagName($name)"; + } + } + } + + template "ppx:action" { + value "ns:ActionTagName(ancestor::ppx:pou/@name, @name)"; + } + + template "ppx:transition" { + value "ns:TransitionTagName(ancestor::ppx:pou/@name, @name)"; + } + + template "ppx:dataType" { + param "element_path"; + apply "ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" { + with "element_path", "$element_path"; + } + } + + template "ppx:derived" { + param "element_path"; + variable "type_name" > «@name» + apply """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:pous/ppx:pou[@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:pous/ppx:pou[@name=$type_name] | + exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" { + with "element_path", "$element_path"; + } + } + + template "ppx:array" { + param "element_path"; + apply "ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" { + with "element_path", "$element_path"; + } + } + + template "ppx:struct" { + param "element_path"; + variable "child_name" { + call "element_name" { + with "path", "$element_path"; + } + } + apply "ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]" { + with "element_path" { + call "next_path" { + with "path", "$element_path"; + } + } + } + } + +}