[lxml-dev] ElementInclude doesn't honour base URLs
Stefan Behnel
stefan_ml at behnel.de
Thu Jun 21 10:00:50 CEST 2007
Mike Meyer wrote:
> In <4679A865.3010706 at behnel.de>, Stefan Behnel <stefan_ml at behnel.de> typed:
>> Mike Meyer wrote:
>>> The problem is that using ElementInclude.include doesn't resolve href
>>> attributes relative to their containing document.
>> Fixed on the trunk and for 1.3.
>
> Cool. Thank you.
>
> For the archives, my workaround for 1.2.x is:
>
> from os.path import join, split
> from lxml.etree import parse
> from lxml.ElementInclude import include, default_loader
>
> class Loader(object):
> """Custom loader for XInclude processing to fix relative addressing for files."""
>
> def __init__(self, name):
> self.base = split(name)[0]
>
> def __call__(self, href, typ, encoding=None):
> return default_loader(join(self.base, href), typ, encoding)
This only works for local files. You can use "urlparse.urljoin" to make it
work for more or less any file path or URL (remember that lxml supports ftp
and http). You don't even need to do the split before hand, BTW.
Ah, and I don't think this works for included files including files themselves
from different directories. But it's still a good work around for most use cases.
Stefan
More information about the lxml-dev
mailing list