PLCControler.py
changeset 1350 7280349a3375
parent 1348 aee0a7eb833a
child 1351 a546a63ce1bf
--- a/PLCControler.py	Wed Oct 09 22:01:21 2013 +0200
+++ b/PLCControler.py	Wed Oct 09 23:06:47 2013 +0200
@@ -242,35 +242,13 @@
 #            Helpers object for generating instances path list
 #-------------------------------------------------------------------------------
 
-class InstanceDefinition(etree.XSLTExtension):
-    
-    def __init__(self, controller, debug):
-        etree.XSLTExtension.__init__(self)
-        self.Controller = controller
-        self.Debug = debug
-    
-    def execute(self, context, self_node, input_node, output_parent):
-        instance_infos = etree.Element('infos')
-        self.process_children(context, instance_infos)
-        
-        pou_infos = self.Controller.GetPou(instance_infos.get("name"), self.Debug)
-        if pou_infos is not None:
-            pou_instance = etree.Element('pou_instance',
-                pou_path=instance_infos.get("path"))
-            pou_instance.append(deepcopy(pou_infos))
-            self.apply_templates(context, pou_instance, output_parent)
-            return
-            
-        datatype_infos = self.Controller.GetDataType(instance_infos.get("name"), self.Debug)
-        if datatype_infos is not None:
-            datatype_instance = etree.Element('datatype_instance',
-                datatype_path=instance_infos.get("path"))
-            datatype_instance.append(deepcopy(datatype_infos))
-            self.apply_templates(context, datatype_instance, output_parent)
-            return
-
-instances_path_xslt = etree.parse(
-    os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"))
+class InstancesPathFactory:
+    
+    def __init__(self, instances):
+        self.Instances = instances
+        
+    def AddInstance(self, context, *args):
+        self.Instances.append(args[0][0])
 
 #-------------------------------------------------------------------------------
 #            Helpers object for generating instance tagname
@@ -795,14 +773,25 @@
     def GetInstanceList(self, root, name, debug = False):
         project = self.GetProject(debug)
         if project is not None:
+            instances = []
+            factory = InstancesPathFactory(instances)
+            
+            parser = etree.XMLParser()
+            parser.resolvers.add(LibraryResolver(self, debug))
+            
             instances_path_xslt_tree = etree.XSLT(
-                instances_path_xslt, 
+                etree.parse(
+                    os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"),
+                    parser), 
                 extensions = {
-                    ("instances_ns", "instance_definition"): 
-                    InstanceDefinition(self, debug)})
+                    ("instances_ns", "AddInstance"): factory.AddInstance})
             
-            return instances_path_xslt_tree(root, 
-                instance_type=etree.XSLT.strparam(name)).getroot()
+            instances_path_xslt_tree(root, 
+                instance_type=etree.XSLT.strparam(name))
+            
+            if len(instances) > 0:
+                return instances
+        
         return None
 
     def SearchPouInstances(self, tagname, debug = False):
@@ -810,10 +799,7 @@
         if project is not None:
             words = tagname.split("::")
             if words[0] == "P":
-                result = self.GetInstanceList(project, words[1])
-                if result is not None:
-                    return [instance.get("path") for instance in result]
-                return []
+                return self.GetInstanceList(project, words[1])
             elif words[0] == 'C':
                 return [words[1]]
             elif words[0] == 'R':