| #!/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) |