'Wraps XML contents into an XML envelope like:
<contents>
<object>
<description>Description Text</description>
<-- tree gets copied in here -->
</object>
<!-- can be multiple <object> elements -->
</contents>
@param tree: the element tree or list of trees to wrap, can also
be a list of tuples (tree, description) in order to
provide a description for each XML content object
@param stylesheet_path: the path to the XSLT transformation stylesheet
to transform the envelope (e.g. into EDXL-DE)
@param args: stylesheet parameters'

def envelope(self, tree, stylesheet_path, **args):

    if (not isinstance(tree, (list, tuple))):
        tree = [tree]
    root = etree.Element(self.TAG.contents)
    for subtree in tree:
        contentDescription = None
        if isinstance(subtree, (list, tuple)):
            contentObject = subtree[0]
            if (len(subtree) > 1):
                contentDescription = subtree[1]
        if isinstance(subtree, etree._ElementTree):
            contentObject = subtree.getroot()
        else:
            contentObject = subtree
        obj = etree.SubElement(root, self.TAG.object)
        if contentDescription:
            desc = etree.SubElement(obj, self.TAG.description)
            desc.text = contentDescription
        from copy import deepcopy
        obj.append(deepcopy(contentObject))
    return self.transform(root, stylesheet_path, **args)
