Switch to side-by-side view

--- a/src/filters/rclxslt.py
+++ b/src/filters/rclxslt.py
@@ -17,36 +17,54 @@
 
 # Helper module for xslt-based filters
 
+from __future__ import print_function
+
 import sys
 
-try:
-    import libxml2
-    import libxslt
-except:
-    print "RECFILTERROR HELPERNOTFOUND python:libxml2/python:libxslt1"
-    sys.exit(1);
+PY2 = sys.version < '3'
 
-libxml2.substituteEntitiesDefault(1)
+if PY2:
+    try:
+        import libxml2
+        import libxslt
+        libxml2.substituteEntitiesDefault(1)
+    except:
+        print("RECFILTERROR HELPERNOTFOUND python:libxml2/python:libxslt1")
+        sys.exit(1);
+    def apply_sheet_data(sheet, data):
+        styledoc = libxml2.parseMemory(sheet, len(sheet))
+        style = libxslt.parseStylesheetDoc(styledoc)
+        doc = libxml2.parseMemory(data, len(data))
+        result = style.applyStylesheet(doc, None)
+        res = style.saveResultToString(result)
+        style.freeStylesheet()
+        doc.freeDoc()
+        result.freeDoc()
+        return res
+    def apply_sheet_file(sheet, fn):
+        styledoc = libxml2.parseMemory(sheet, len(sheet))
+        style = libxslt.parseStylesheetDoc(styledoc)
+        doc = libxml2.parseFile(fn)
+        result = style.applyStylesheet(doc, None)
+        res = style.saveResultToString(result)
+        style.freeStylesheet()
+        doc.freeDoc()
+        result.freeDoc()
+        return res
+else:
+    try:
+        from lxml import etree
+    except:
+        print("RECFILTERROR HELPERNOTFOUND python3:lxml")
+        sys.exit(1);
+    def apply_sheet_data(sheet, data):
+        styledoc = etree.fromstring(sheet)
+        transform = etree.XSLT(styledoc)
+        doc = etree.fromstring(data)
+        return etree.tostring(transform(doc))
+    def apply_sheet_file(sheet, fn):
+        styledoc = etree.fromstring(sheet)
+        transform = etree.XSLT(styledoc)
+        doc = etree.parse(fn)
+        return etree.tostring(transform(doc))
 
-def apply_sheet_data(sheet, data):
-    styledoc = libxml2.parseMemory(sheet, len(sheet))
-    style = libxslt.parseStylesheetDoc(styledoc)
-    doc = libxml2.parseMemory(data, len(data))
-    result = style.applyStylesheet(doc, None)
-    res = style.saveResultToString(result)
-    style.freeStylesheet()
-    doc.freeDoc()
-    result.freeDoc()
-    return res
-
-def apply_sheet_file(sheet, fn):
-    styledoc = libxml2.parseMemory(sheet, len(sheet))
-    style = libxslt.parseStylesheetDoc(styledoc)
-    doc = libxml2.parseFile(fn)
-    result = style.applyStylesheet(doc, None)
-    res = style.saveResultToString(result)
-    style.freeStylesheet()
-    doc.freeDoc()
-    result.freeDoc()
-    return res
-