def test_xpath_eval_context_clear(self): tree = self.parse('<root><a/><b><c/></b></root>') check_call = {} def check_context(ctxt): check_call["done"] = True # context must be empty for each new evaluation self.assertEquals(len(ctxt.eval_context), 0) ctxt.eval_context["test"] = True return True find = etree.XPath("//b[p:foo()]", namespaces={'p' : 'ns'}, extensions=[{('ns', 'foo') : check_context}]) result = find(tree) self.assertEquals(result, [tree.getroot()[1]]) self.assertEquals(check_call["done"], True) check_call.clear() find = etree.XPath("//b[p:foo()]", namespaces={'p' : 'ns'}, extensions=[{('ns', 'foo') : check_context}]) result = find(tree) self.assertEquals(result, [tree.getroot()[1]]) self.assertEquals(check_call["done"], True)
def test_xpath_compile_element(self): x = self.parse('<a><b/><c/></a>') root = x.getroot() expr = etree.XPath("./b") r = expr(root) self.assertEquals(1, len(r)) self.assertEquals('b', r[0].tag) expr = etree.XPath("./*") r = expr(root) self.assertEquals(2, len(r))
def test_xpath_compile_doc(self): x = self.parse('<a attr="true"/>') expr = etree.XPath("/a[@attr != 'true']") r = expr(x) self.assertEquals(0, len(r)) expr = etree.XPath("/a[@attr = 'true']") r = expr(x) self.assertEquals(1, len(r)) expr = etree.XPath( expr.path ) r = expr(x) self.assertEquals(1, len(r))
def test_xpath_compile_vars(self): x = self.parse('<a attr="true"/>') expr = etree.XPath("/a[@attr=$aval]") r = expr(x, aval=False) self.assertEquals(0, len(r)) r = expr(x, aval=True) self.assertEquals(1, len(r))
def _validation_errors(self, validationReport): valid = etree.XPath( 'count(//svrl:successful-report[@flag="critical"])=1', namespaces={'svrl': isoschematron.SVRL_NS})( validationReport) if valid: return [] error = etree.Element('Error') error.text = 'missing critical condition report' return [error]
def test_xpath_context_node(self): tree = self.parse('<root><a/><b><c/></b></root>') check_call = [] def check_context(ctxt, nodes): self.assertEquals(len(nodes), 1) check_call.append(nodes[0].tag) self.assertEquals(ctxt.context_node, nodes[0]) return True find = etree.XPath("//*[p:foo(.)]", namespaces={'p' : 'ns'}, extensions=[{('ns', 'foo') : check_context}]) find(tree) check_call.sort() self.assertEquals(check_call, ["a", "b", "c", "root"])
def test_xpath_eval_context_propagation(self): tree = self.parse('<root><a/><b><c/></b></root>') check_call = {} def check_context(ctxt, nodes): self.assertEquals(len(nodes), 1) tag = nodes[0].tag # empty during the "b" call, a "b" during the "c" call check_call[tag] = ctxt.eval_context.get("b") ctxt.eval_context[tag] = tag return True find = etree.XPath("//b[p:foo(.)]/c[p:foo(.)]", namespaces={'p' : 'ns'}, extensions=[{('ns', 'foo') : check_context}]) result = find(tree) self.assertEquals(result, [tree.getroot()[1][0]]) self.assertEquals(check_call, {'b':None, 'c':'b'})
def test_xpath_elementtree_error(self): self.assertRaises(ValueError, etree.XPath('*'), etree.ElementTree())
def test_xpath_class_prefix_error(self): tree = self.parse('<a/>') xpath = etree.XPath("/fa:d") self.assertRaises(etree.XPathEvalError, xpath, tree)