|  | #!/usr/bin/env python3 | 
|  | import lxml.etree as ET | 
|  | import os | 
|  |  | 
|  | xi_url = "http://www.w3.org/2001/XInclude" | 
|  |  | 
|  | xi_include = "{{{}}}include".format(xi_url) | 
|  |  | 
|  | ET.register_namespace('xi', xi_url) | 
|  |  | 
|  |  | 
|  | def make_relhref(outfile, href): | 
|  | outpath = os.path.dirname(os.path.abspath(outfile)) | 
|  | relpath = os.path.relpath(os.path.dirname(os.path.abspath(href)), outpath) | 
|  | return os.path.join(relpath, os.path.basename(href)) | 
|  |  | 
|  |  | 
|  | def include_xml(parent, href, outfile, xptr=None): | 
|  | """ | 
|  | Generate an XML include, using a relative path. | 
|  |  | 
|  | Inputs | 
|  | ------ | 
|  | parent : XML element to insert include into | 
|  | href : path to included file | 
|  | outfile : path to output file, for relative path generation | 
|  | xptr : optional value for xpointer attribute | 
|  | """ | 
|  | xattrs = {'href': make_relhref(outfile, href)} | 
|  | if xptr is not None: | 
|  | xattrs["xpointer"] = xptr | 
|  | return ET.SubElement(parent, xi_include, xattrs) |