summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt2
-rw-r--r--src/lxml/ElementInclude.py15
-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.py10
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