diff options
-rw-r--r-- | CHANGES.txt | 2 | ||||
-rw-r--r-- | src/lxml/ElementInclude.py | 15 | ||||
-rw-r--r-- | src/lxml/tests/include/test_xinclude.xml (renamed from src/lxml/tests/test_xinclude.xml) | 2 | ||||
-rw-r--r-- | src/lxml/tests/test_etree.py | 10 |
4 files changed, 17 insertions, 12 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 72e1ce7e..46f55bbf 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -52,6 +52,8 @@ Features added Bugs fixed ---------- +* ``ElementInclude`` didn't honour base URL of original document + * Replacing the children slice of an Element would cut off the tails of the original children diff --git a/src/lxml/ElementInclude.py b/src/lxml/ElementInclude.py index 52fcaeb7..e25e6368 100644 --- a/src/lxml/ElementInclude.py +++ b/src/lxml/ElementInclude.py @@ -46,6 +46,7 @@ ## import copy, etree +from urlparse import urljoin try: set @@ -123,13 +124,15 @@ def _wrap_et_loader(loader): def include(elem, loader=None): if hasattr(elem, 'getroot'): - #if hasattr(elem, 'docinfo'): - # base_url = elem.docinfo.URL - _include(elem.getroot(), loader) + tree = elem + elem = elem.getroot() else: - _include(elem, loader) + tree = elem.getroottree() + if hasattr(tree, 'docinfo'): + base_url = tree.docinfo.URL + _include(elem, loader, base_url=base_url) -def _include(elem, loader=None, _parent_hrefs=None): +def _include(elem, loader=None, _parent_hrefs=None, base_url=None): if loader is not None: load_include = _wrap_et_loader(loader) else: @@ -146,7 +149,7 @@ def _include(elem, loader=None, _parent_hrefs=None): for e in include_elements: if e.tag == XINCLUDE_INCLUDE: # process xinclude directive - href = e.get("href") + href = urljoin(base_url, e.get("href")) parse = e.get("parse", "xml") parent = e.getparent() if parse == "xml": diff --git a/src/lxml/tests/test_xinclude.xml b/src/lxml/tests/include/test_xinclude.xml index c62703f3..1cc05cf8 100644 --- a/src/lxml/tests/test_xinclude.xml +++ b/src/lxml/tests/include/test_xinclude.xml @@ -1,4 +1,4 @@ <doc xmlns:xi="http://www.w3.org/2001/XInclude"> <foo/> -<xi:include href="test.xml" /> +<xi:include href="../test.xml" /> </doc>
\ No newline at end of file diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py index f142da83..052139fe 100644 --- a/src/lxml/tests/test_etree.py +++ b/src/lxml/tests/test_etree.py @@ -1634,12 +1634,8 @@ class XIncludeTestCase(HelperTestCase): self.assertEquals(old_text + content + old_tail, root.text) -class ETreeXIncludeTestCase(XIncludeTestCase): - def include(self, tree): - tree.xinclude() - def test_xinclude(self): - tree = etree.parse(fileInTestDir('test_xinclude.xml')) + tree = etree.parse(fileInTestDir('include/test_xinclude.xml')) # process xincludes self.include( tree ) # check whether we find it replaced with included data @@ -1647,6 +1643,10 @@ class ETreeXIncludeTestCase(XIncludeTestCase): 'a', tree.getroot()[1].tag) +class ETreeXIncludeTestCase(XIncludeTestCase): + def include(self, tree): + tree.xinclude() + class ElementIncludeTestCase(XIncludeTestCase): from lxml import ElementInclude |