fixed xmlReconciliateNs(), added a Python test/example for inter-document

* tree.c python/tests/Makefile.am python/tests/cutnpaste.py:
  fixed xmlReconciliateNs(), added a Python test/example for
  inter-document cut'n paste
* python/libxml.py: fixed node.doc on document nodes and added
  xpathEval() onto node objects
Daniel
diff --git a/python/libxml.py b/python/libxml.py
index 8d99466..3c15102 100644
--- a/python/libxml.py
+++ b/python/libxml.py
@@ -181,8 +181,11 @@
         elif attr == "doc":
             ret = libxml2mod.doc(self._o)
             if ret == None:
-                return None
-            return xmlDoc(_doc=ret)
+		if self.type == "document_xml" or self.type == "document_html":
+		    return xmlDoc(_obj=self._o)
+		else:
+		    return None
+            return xmlDoc(_obj=ret)
         raise AttributeError,attr
 
         #
@@ -235,7 +238,7 @@
         ret = libxml2mod.doc(self._o)
         if ret == None:
             return None
-        return xmlDoc(_doc=ret)
+        return xmlDoc(_obj=ret)
     def free(self):
         libxml2mod.freeDoc(self._o)
 
@@ -250,6 +253,20 @@
     def saveTo(self, file, encoding = None, format = 0):
         return libxml2mod.saveNodeTo(self._o, file, encoding, format)
             
+    #
+    # Selecting nodes using XPath, a bit slow because the context
+    # is allocated/freed every time but convenient.
+    #
+    def xpathEval(self, expr):
+	doc = self.doc
+	if doc == None:
+	    return None
+	ctxt = doc.xpathNewContext()
+	ctxt.setContextNode(self)
+	res = ctxt.xpathEval(expr)
+	ctxt.xpathFreeContext()
+	return res
+	
 #
 # converters to present a nicer view of the XPath returns
 #
diff --git a/python/tests/Makefile.am b/python/tests/Makefile.am
index b5e2c43..b8ee7b7 100644
--- a/python/tests/Makefile.am
+++ b/python/tests/Makefile.am
@@ -11,6 +11,7 @@
     serialize.py\
     validate.py	\
     tstURI.py	\
+    cutnpaste.py\
     xpathret.py	\
     xpath.py
 
diff --git a/python/tests/cutnpaste.py b/python/tests/cutnpaste.py
new file mode 100755
index 0000000..0f9665a
--- /dev/null
+++ b/python/tests/cutnpaste.py
@@ -0,0 +1,48 @@
+#!/usr/bin/python -u
+import sys
+import libxml2
+
+# Memory debug specific
+libxml2.debugMemory(1)
+
+#
+# Testing XML document serialization
+#
+source = libxml2.parseDoc("""<?xml version="1.0"?>
+<root xmlns:foo="http://example.org/foo"
+      xmlns:bar="http://example.org/bar">
+<include xmlns="http://example.org/include">
+<fragment><foo:elem bar="tricky"/></fragment>
+</include>
+</root>
+""")
+
+target = libxml2.parseDoc("""<?xml version="1.0"?>
+<root xmlns:foobar="http://example.org/bar"/>""")
+
+fragment = source.xpathEval("//*[name()='fragment']")[0]
+dest = target.getRootElement()
+
+# do a cut and paste operation
+fragment.unlinkNode()
+dest.addChild(fragment)
+# do the namespace fixup
+dest.reconciliateNs(target)
+
+# The source tree can be freed at that point
+source.freeDoc()
+
+# check the resulting tree
+str = dest.serialize()
+if str != """<root xmlns:foobar="http://example.org/bar" xmlns:default="http://example.org/include" xmlns:foo="http://example.org/foo"><default:fragment><foo:elem bar="tricky"/></default:fragment></root>""":
+    print "reconciliateNs() failed"
+    sys.exit(1)
+target.freeDoc()
+
+# Memory debug specific
+libxml2.cleanupParser()
+if libxml2.debugMemory(1) == 0:
+    print "OK"
+else:
+    print "Memory leak %d bytes" % (libxml2.debugMemory(1))
+    libxml2.dumpMemory()