Transform ``xslt`` using any of the 3 supported xslt engines:

    - `lxml <http://codespeak.net/lxml/>`_
    - `libxml <http://xmlsoft.org/python.html>`_

    :param xml: The xml to be transformed.
    :param xslt: The xslt to be used when transforming the ``xml``.
    :param params: A dictionary containing xslt parameters. Use :func:`~easymode.xslt.prepare_string_param`\
        on strings you want to pass in.

def _transform_libxslt(xml, xslt, params=None):
    """
    Transform ``xslt`` using any of the 3 supported xslt engines:

    - `lxml <http://codespeak.net/lxml/>`_
    - `libxml <http://xmlsoft.org/python.html>`_

    :param xml: The xml to be transformed.
    :param xslt: The xslt to be used when transforming the ``xml``.
    :param params: A dictionary containing xslt parameters. Use :func:`~easymode.xslt.prepare_string_param`\
        on strings you want to pass in.
    """
    try:
        xslt_doc = libxml2.parseFile(xslt)
        xslt_proc = libxslt.parseStylesheetDoc(xslt_doc)
        xml_doc = libxml2.parseDoc(xml)
        
        result = xslt_proc.applyStylesheet(xml_doc, params)

        xml_string = str(result)
        xml_unicode_string = xml_string.decode('utf-8')

        xslt_proc.freeStylesheet()
        xml_doc.freeDoc()

        return xml_unicode_string
    except RuntimeError as e:
        raise XsltError(str(e))