[Lxml-checkins] r46221 - in lxml/trunk: . src/lxml src/lxml/tests
scoder at codespeak.net
scoder at codespeak.net
Fri Aug 31 19:07:27 CEST 2007
Author: scoder
Date: Fri Aug 31 19:07:26 2007
New Revision: 46221
Modified:
lxml/trunk/CHANGES.txt
lxml/trunk/src/lxml/extensions.pxi
lxml/trunk/src/lxml/tests/test_xslt.py
lxml/trunk/src/lxml/xslt.pxi
Log:
preliminary implementation of deep copy support for XSLT
Modified: lxml/trunk/CHANGES.txt
==============================================================================
--- lxml/trunk/CHANGES.txt (original)
+++ lxml/trunk/CHANGES.txt Fri Aug 31 19:07:26 2007
@@ -8,6 +8,8 @@
Features added
--------------
+* XSLT objects now support deep copying
+
* New ``makeSubElement()`` C-API function that allows creating a new
subelement straight with text, tail and attributes.
Modified: lxml/trunk/src/lxml/extensions.pxi
==============================================================================
--- lxml/trunk/src/lxml/extensions.pxi (original)
+++ lxml/trunk/src/lxml/extensions.pxi Fri Aug 31 19:07:26 2007
@@ -92,7 +92,7 @@
_regexp = _ExsltRegExp()
_regexp._register_in_context(self)
- cdef _copy(self):
+ cdef _BaseContext _copy(self):
cdef _BaseContext context
if self._namespaces is not None:
namespaces = self._namespaces[:]
Modified: lxml/trunk/src/lxml/tests/test_xslt.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_xslt.py (original)
+++ lxml/trunk/src/lxml/tests/test_xslt.py Fri Aug 31 19:07:26 2007
@@ -4,7 +4,7 @@
Test cases related to XSLT processing
"""
-import unittest
+import unittest, copy
from common_imports import etree, StringIO, HelperTestCase, fileInTestDir
from common_imports import doctest
@@ -49,6 +49,41 @@
self.assertRaises(
etree.XSLTParseError, etree.XSLT, style)
+
+ def test_xslt_copy(self):
+ tree = self.parse('<a><b>B</b><c>C</c></a>')
+ style = self.parse('''\
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:template match="*" />
+ <xsl:template match="/">
+ <foo><xsl:value-of select="/a/b/text()" /></foo>
+ </xsl:template>
+</xsl:stylesheet>''')
+
+ transform = etree.XSLT(style)
+ res = transform(tree)
+ self.assertEquals('''\
+<?xml version="1.0"?>
+<foo>B</foo>
+''',
+ str(res))
+
+ transform_copy = copy.deepcopy(transform)
+ res = transform_copy(tree)
+ self.assertEquals('''\
+<?xml version="1.0"?>
+<foo>B</foo>
+''',
+ str(res))
+
+ transform = etree.XSLT(style)
+ res = transform(tree)
+ self.assertEquals('''\
+<?xml version="1.0"?>
+<foo>B</foo>
+''',
+ str(res))
def test_xslt_utf8(self):
tree = self.parse(u'<a><b>\uF8D2</b><c>\uF8D2</c></a>')
Modified: lxml/trunk/src/lxml/xslt.pxi
==============================================================================
--- lxml/trunk/src/lxml/xslt.pxi (original)
+++ lxml/trunk/src/lxml/xslt.pxi Fri Aug 31 19:07:26 2007
@@ -55,6 +55,12 @@
self._parser = parser
self._c_style_doc = NULL
+ cdef _XSLTResolverContext _copy(self):
+ cdef _XSLTResolverContext context
+ context = _XSLTResolverContext(self._parser)
+ context._c_style_doc = _copyDoc(self._c_style_doc, 1)
+ return context
+
cdef xmlDoc* _xslt_resolve_stylesheet(char* c_uri, void* context):
cdef xmlDoc* c_doc
c_doc = (<_XSLTResolverContext>context)._c_style_doc
@@ -337,6 +343,26 @@
"""
return str(result_tree)
+ def __deepcopy__(self, memo):
+ return self.__copy__()
+
+ def __copy__(self):
+ cdef XSLT new_xslt
+ cdef xmlDoc* c_doc
+ new_xslt = NEW_XSLT(XSLT)
+ new_xslt._access_control = self._access_control
+ new_xslt._error_log = _ErrorLog()
+ new_xslt._context = self._context._copy()
+ new_xslt._xslt_resolver_context = self._xslt_resolver_context._copy()
+
+ c_doc = _copyDoc(self._c_style.doc, 1)
+ new_xslt._c_style = xslt.xsltParseStylesheetDoc(c_doc)
+ if new_xslt._c_style is NULL:
+ tree.xmlFreeDoc(c_doc)
+ python.PyErr_NoMemory()
+
+ return new_xslt
+
def __call__(self, _input, profile_run=False, **_kw):
cdef _XSLTContext context
cdef _Document input_doc
@@ -463,6 +489,10 @@
return c_result
+cdef extern from "etree_defs.h":
+ # macro call to 't->tp_new()' for instantiation without calling __init__()
+ cdef XSLT NEW_XSLT "PY_NEW" (object t)
+
cdef class _XSLTResultTree(_ElementTree):
cdef XSLT _xslt
cdef _Document _profile
More information about the lxml-checkins
mailing list