u"""Executes XPath query on the ``lxml`` object and returns a correct object.

        :param str path: XPath string e.g., 'cars'/'car'

        :param str/dict namespaces: e.g., 'exslt', 're' or
            ``{'re': "http://exslt.org/regular-expressions"}``
        :param bool regexp: if ``True`` and no namespaces is provided, it will use
            ``exslt`` namespace
        :param bool smart_strings:
        :param bool single_use: faster method for using only once. Does not
            create ``XPathEvaluator`` instance.

        >>> root = mappet.Mappet("<root><a>aB</a><b>aBc</b></root>")
        >>> root.XPath(
            "//*[re:test(., '^abc$', 'i')]",
            namespaces='exslt',
            regexp=True,
        )

def xpath(
            self,
            path,
            namespaces=None,
            regexp=False,
            smart_strings=True,
            single_use=False,
    ):
        u"""Executes XPath query on the ``lxml`` object and returns a correct object.

        :param str path: XPath string e.g., 'cars'/'car'

        :param str/dict namespaces: e.g., 'exslt', 're' or
            ``{'re': "http://exslt.org/regular-expressions"}``
        :param bool regexp: if ``True`` and no namespaces is provided, it will use
            ``exslt`` namespace
        :param bool smart_strings:
        :param bool single_use: faster method for using only once. Does not
            create ``XPathEvaluator`` instance.

        >>> root = mappet.Mappet("<root><a>aB</a><b>aBc</b></root>")
        >>> root.XPath(
            "//*[re:test(., '^abc$', 'i')]",
            namespaces='exslt',
            regexp=True,
        )
        """
        if (
            namespaces in ['exslt', 're'] or
            (regexp and not namespaces)
        ):
            namespaces = {'re': "http://exslt.org/regular-expressions"}
        if single_use:
            node = self._xml.xpath(path)
        else:
            xpe = self.xpath_evaluator(
                namespaces=namespaces,
                regexp=regexp,
                smart_strings=smart_strings
            )
            node = xpe(path)

        if len(node) == 1:
            node = node[0]
            if len(node):
                return self.__class__(node)
            else:
                return Literal(node)
        return node