Package lxml :: Package tests :: Module test_xslt
[hide private]
[frames] | no frames]

Source Code for Module lxml.tests.test_xslt

   1  # -*- coding: utf-8 -*- 
   2   
   3  """ 
   4  Test cases related to XSLT processing 
   5  """ 
   6   
   7  import unittest, copy 
   8   
   9  from common_imports import etree, StringIO, HelperTestCase, fileInTestDir 
  10  from common_imports import doctest 
  11   
12 -class ETreeXSLTTestCase(HelperTestCase):
13 """XPath tests etree""" 14
15 - def test_xslt(self):
16 tree = self.parse('<a><b>B</b><c>C</c></a>') 17 style = self.parse('''\ 18 <xsl:stylesheet version="1.0" 19 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 20 <xsl:template match="*" /> 21 <xsl:template match="/"> 22 <foo><xsl:value-of select="/a/b/text()" /></foo> 23 </xsl:template> 24 </xsl:stylesheet>''') 25 26 st = etree.XSLT(style) 27 res = st.apply(tree) 28 self.assertEquals('''\ 29 <?xml version="1.0"?> 30 <foo>B</foo> 31 ''', 32 st.tostring(res))
33
35 self.assertRaises(ValueError, etree.XSLT, etree.ElementTree())
36
37 - def test_xslt_input_none(self):
38 self.assertRaises(TypeError, etree.XSLT, None)
39 40 if False and etree.LIBXSLT_VERSION >= (1,1,15): 41 # earlier versions generate no error 42 if etree.LIBXSLT_VERSION > (1,1,17):
44 style = self.parse('''\ 45 <xsl:stylesheet version="1.0" 46 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 47 <xsl:stylesheet /> 48 </xsl:stylesheet>''') 49 50 self.assertRaises( 51 etree.XSLTParseError, etree.XSLT, style)
52
53 - def test_xslt_copy(self):
54 tree = self.parse('<a><b>B</b><c>C</c></a>') 55 style = self.parse('''\ 56 <xsl:stylesheet version="1.0" 57 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 58 <xsl:template match="*" /> 59 <xsl:template match="/"> 60 <foo><xsl:value-of select="/a/b/text()" /></foo> 61 </xsl:template> 62 </xsl:stylesheet>''') 63 64 transform = etree.XSLT(style) 65 res = transform(tree) 66 self.assertEquals('''\ 67 <?xml version="1.0"?> 68 <foo>B</foo> 69 ''', 70 str(res)) 71 72 transform_copy = copy.deepcopy(transform) 73 res = transform_copy(tree) 74 self.assertEquals('''\ 75 <?xml version="1.0"?> 76 <foo>B</foo> 77 ''', 78 str(res)) 79 80 transform = etree.XSLT(style) 81 res = transform(tree) 82 self.assertEquals('''\ 83 <?xml version="1.0"?> 84 <foo>B</foo> 85 ''', 86 str(res))
87
88 - def test_xslt_utf8(self):
89 tree = self.parse(u'<a><b>\uF8D2</b><c>\uF8D2</c></a>') 90 style = self.parse('''\ 91 <xsl:stylesheet version="1.0" 92 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 93 <xsl:output encoding="UTF-8"/> 94 <xsl:template match="/"> 95 <foo><xsl:value-of select="/a/b/text()" /></foo> 96 </xsl:template> 97 </xsl:stylesheet>''') 98 99 st = etree.XSLT(style) 100 res = st.apply(tree) 101 expected = u'''\ 102 <?xml version="1.0" encoding="UTF-8"?> 103 <foo>\uF8D2</foo> 104 ''' 105 self.assertEquals(expected, 106 unicode(str(res), 'UTF-8'))
107
108 - def test_xslt_encoding(self):
109 tree = self.parse(u'<a><b>\uF8D2</b><c>\uF8D2</c></a>') 110 style = self.parse('''\ 111 <xsl:stylesheet version="1.0" 112 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 113 <xsl:output encoding="UTF-16"/> 114 <xsl:template match="/"> 115 <foo><xsl:value-of select="/a/b/text()" /></foo> 116 </xsl:template> 117 </xsl:stylesheet>''') 118 119 st = etree.XSLT(style) 120 res = st.apply(tree) 121 expected = u'''\ 122 <?xml version="1.0" encoding="UTF-16"?> 123 <foo>\uF8D2</foo> 124 ''' 125 self.assertEquals(expected, 126 unicode(str(res), 'UTF-16'))
127
129 tree = self.parse(u'<a><b>\uF8D2</b><c>\uF8D2</c></a>') 130 style = self.parse('''\ 131 <xsl:stylesheet version="1.0" 132 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 133 <xsl:output encoding="UTF-8"/> 134 <xsl:template match="/"> 135 <foo><xsl:value-of select="/a/b/text()" /></foo> 136 </xsl:template> 137 </xsl:stylesheet>''') 138 139 st = etree.XSLT(style) 140 res = st.apply(tree) 141 expected = u"""\ 142 <?xml version='1.0' encoding='UTF-16'?> 143 <foo>\uF8D2</foo>""" 144 145 f = StringIO() 146 res.write(f, encoding='UTF-16') 147 result = unicode(f.getvalue(), 'UTF-16') 148 self.assertEquals(expected, 149 result)
150
151 - def test_xslt_unicode(self):
152 tree = self.parse(u'<a><b>\uF8D2</b><c>\uF8D2</c></a>') 153 style = self.parse('''\ 154 <xsl:stylesheet version="1.0" 155 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 156 <xsl:output encoding="UTF-16"/> 157 <xsl:template match="/"> 158 <foo><xsl:value-of select="/a/b/text()" /></foo> 159 </xsl:template> 160 </xsl:stylesheet>''') 161 162 st = etree.XSLT(style) 163 res = st.apply(tree) 164 expected = u'''\ 165 <?xml version="1.0"?> 166 <foo>\uF8D2</foo> 167 ''' 168 self.assertEquals(expected, 169 unicode(res))
170
171 - def test_exslt_str(self):
172 tree = self.parse('<a><b>B</b><c>C</c></a>') 173 style = self.parse('''\ 174 <xsl:stylesheet version="1.0" 175 xmlns:str="http://exslt.org/strings" 176 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 177 exclude-result-prefixes="str xsl"> 178 <xsl:template match="text()"> 179 <xsl:value-of select="str:align(string(.), '---', 'center')" /> 180 </xsl:template> 181 <xsl:template match="*"> 182 <xsl:copy> 183 <xsl:apply-templates/> 184 </xsl:copy> 185 </xsl:template> 186 </xsl:stylesheet>''') 187 188 st = etree.XSLT(style) 189 res = st(tree) 190 self.assertEquals('''\ 191 <?xml version="1.0"?> 192 <a><b>-B-</b><c>-C-</c></a> 193 ''', 194 str(res))
195
196 - def test_exslt_math(self):
197 tree = self.parse('<a><b>B</b><c>C</c></a>') 198 style = self.parse('''\ 199 <xsl:stylesheet version="1.0" 200 xmlns:math="http://exslt.org/math" 201 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 202 exclude-result-prefixes="math xsl"> 203 <xsl:template match="*"> 204 <xsl:copy> 205 <xsl:attribute name="pi"> 206 <xsl:value-of select="math:constant('PI', count(*)+2)"/> 207 </xsl:attribute> 208 <xsl:apply-templates/> 209 </xsl:copy> 210 </xsl:template> 211 </xsl:stylesheet>''') 212 213 st = etree.XSLT(style) 214 res = st(tree) 215 self.assertEquals('''\ 216 <?xml version="1.0"?> 217 <a pi="3.14"><b pi="3">B</b><c pi="3">C</c></a> 218 ''', 219 str(res))
220
221 - def test_xslt_input(self):
222 style = self.parse('''\ 223 <xsl:stylesheet version="1.0" 224 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 225 <xsl:template match="*" /> 226 <xsl:template match="/"> 227 <foo><xsl:value-of select="/a/b/text()" /></foo> 228 </xsl:template> 229 </xsl:stylesheet>''') 230 231 st = etree.XSLT(style) 232 st = etree.XSLT(style.getroot())
233
235 style = self.parse('''\ 236 <otherroot> 237 <xsl:stylesheet version="1.0" 238 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 239 <xsl:template match="*" /> 240 <xsl:template match="/"> 241 <foo><xsl:value-of select="/a/b/text()" /></foo> 242 </xsl:template> 243 </xsl:stylesheet> 244 </otherroot>''') 245 246 self.assertRaises(etree.XSLTParseError, etree.XSLT, style) 247 root_node = style.getroot() 248 self.assertRaises(etree.XSLTParseError, etree.XSLT, root_node) 249 st = etree.XSLT(root_node[0])
250
251 - def test_xslt_broken(self):
252 tree = self.parse('<a/>') 253 style = self.parse('''\ 254 <xsl:stylesheet version="1.0" 255 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 256 <xsl:foo /> 257 </xsl:stylesheet>''') 258 self.assertRaises(etree.XSLTParseError, 259 etree.XSLT, style)
260
261 - def test_xslt_parameters(self):
262 tree = self.parse('<a><b>B</b><c>C</c></a>') 263 style = self.parse('''\ 264 <xsl:stylesheet version="1.0" 265 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 266 <xsl:template match="/"> 267 <foo><xsl:value-of select="$bar" /></foo> 268 </xsl:template> 269 </xsl:stylesheet>''') 270 271 st = etree.XSLT(style) 272 res = st.apply(tree, bar="'Bar'") 273 self.assertEquals('''\ 274 <?xml version="1.0"?> 275 <foo>Bar</foo> 276 ''', 277 st.tostring(res))
278 279 if etree.LIBXSLT_VERSION < (1,1,18): 280 # later versions produce no error
282 # apply() without needed parameter will lead to XSLTApplyError 283 tree = self.parse('<a><b>B</b><c>C</c></a>') 284 style = self.parse('''\ 285 <xsl:stylesheet version="1.0" 286 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 287 <xsl:template match="/"> 288 <foo><xsl:value-of select="$bar" /></foo> 289 </xsl:template> 290 </xsl:stylesheet>''') 291 292 st = etree.XSLT(style) 293 self.assertRaises(etree.XSLTApplyError, 294 st.apply, tree)
295
297 tree = self.parse('<a><b>B</b><c>C</c></a>') 298 style = self.parse('''\ 299 <xsl:stylesheet version="1.0" 300 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 301 <xsl:template match="*" /> 302 <xsl:template match="/"> 303 <foo><xsl:value-of select="$bar" /></foo> 304 <foo><xsl:value-of select="$baz" /></foo> 305 </xsl:template> 306 </xsl:stylesheet>''') 307 308 st = etree.XSLT(style) 309 res = st.apply(tree, bar="'Bar'", baz="'Baz'") 310 self.assertEquals('''\ 311 <?xml version="1.0"?> 312 <foo>Bar</foo><foo>Baz</foo> 313 ''', 314 st.tostring(res))
315
316 - def test_xslt_parameter_xpath(self):
317 tree = self.parse('<a><b>B</b><c>C</c></a>') 318 style = self.parse('''\ 319 <xsl:stylesheet version="1.0" 320 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 321 <xsl:template match="*" /> 322 <xsl:template match="/"> 323 <foo><xsl:value-of select="$bar" /></foo> 324 </xsl:template> 325 </xsl:stylesheet>''') 326 327 st = etree.XSLT(style) 328 res = st.apply(tree, bar="/a/b/text()") 329 self.assertEquals('''\ 330 <?xml version="1.0"?> 331 <foo>B</foo> 332 ''', 333 st.tostring(res))
334 335
337 tree = self.parse('<a><b>B</b><c>C</c></a>') 338 style = self.parse('''\ 339 <xsl:stylesheet version="1.0" 340 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 341 <xsl:param name="bar" select="'Default'" /> 342 <xsl:template match="*" /> 343 <xsl:template match="/"> 344 <foo><xsl:value-of select="$bar" /></foo> 345 </xsl:template> 346 </xsl:stylesheet>''') 347 348 st = etree.XSLT(style) 349 res = st.apply(tree, bar="'Bar'") 350 self.assertEquals('''\ 351 <?xml version="1.0"?> 352 <foo>Bar</foo> 353 ''', 354 st.tostring(res)) 355 res = st.apply(tree) 356 self.assertEquals('''\ 357 <?xml version="1.0"?> 358 <foo>Default</foo> 359 ''', 360 st.tostring(res))
361
362 - def test_xslt_html_output(self):
363 tree = self.parse('<a><b>B</b><c>C</c></a>') 364 style = self.parse('''\ 365 <xsl:stylesheet version="1.0" 366 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 367 <xsl:output method="html"/> 368 <xsl:strip-space elements="*"/> 369 <xsl:template match="/"> 370 <html><body><xsl:value-of select="/a/b/text()" /></body></html> 371 </xsl:template> 372 </xsl:stylesheet>''') 373 374 st = etree.XSLT(style) 375 res = st(tree) 376 self.assertEquals('''<html><body>B</body></html>''', 377 str(res).strip())
378
379 - def test_xslt_include(self):
380 tree = etree.parse(fileInTestDir('test1.xslt')) 381 st = etree.XSLT(tree)
382
384 f = open(fileInTestDir('test1.xslt'), 'r') 385 tree = etree.parse(f) 386 f.close() 387 st = etree.XSLT(tree)
388
390 xml = '<a/>' 391 xslt = '''\ 392 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 393 <xsl:template match="/"> 394 <response>Some text</response> 395 </xsl:template> 396 </xsl:stylesheet> 397 ''' 398 source = self.parse(xml) 399 styledoc = self.parse(xslt) 400 style = etree.XSLT(styledoc) 401 result = style.apply(source) 402 403 etree.tostring(result.getroot()) 404 405 source = self.parse(xml) 406 styledoc = self.parse(xslt) 407 style = etree.XSLT(styledoc) 408 result = style.apply(source) 409 410 etree.tostring(result.getroot())
411
412 - def test_xslt_repeat_transform(self):
413 xml = '<a/>' 414 xslt = '''\ 415 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 416 <xsl:template match="/"> 417 <response>Some text</response> 418 </xsl:template> 419 </xsl:stylesheet> 420 ''' 421 source = self.parse(xml) 422 styledoc = self.parse(xslt) 423 transform = etree.XSLT(styledoc) 424 result = transform.apply(source) 425 result = transform.apply(source) 426 etree.tostring(result.getroot()) 427 result = transform.apply(source) 428 etree.tostring(result.getroot()) 429 str(result) 430 431 result1 = transform(source) 432 result2 = transform(source) 433 self.assertEquals(str(result1), str(result2)) 434 result = transform(source) 435 str(result)
436
437 - def test_xslt_empty(self):
438 # could segfault if result contains "empty document" 439 xml = '<blah/>' 440 xslt = ''' 441 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 442 <xsl:template match="/" /> 443 </xsl:stylesheet> 444 ''' 445 446 source = self.parse(xml) 447 styledoc = self.parse(xslt) 448 style = etree.XSLT(styledoc) 449 result = style.apply(source) 450 self.assertEqual('', style.tostring(result)) 451 self.assertEqual('', str(result))
452
453 - def test_xslt_message(self):
454 xml = '<blah/>' 455 xslt = ''' 456 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 457 <xsl:template match="/"> 458 <xsl:message>TEST TEST TEST</xsl:message> 459 </xsl:template> 460 </xsl:stylesheet> 461 ''' 462 463 source = self.parse(xml) 464 styledoc = self.parse(xslt) 465 style = etree.XSLT(styledoc) 466 result = style.apply(source) 467 self.assertEqual('', style.tostring(result)) 468 self.assertEqual('', str(result)) 469 self.assert_("TEST TEST TEST" in [entry.message 470 for entry in style.error_log])
471
473 xml = '<blah/>' 474 xslt = ''' 475 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 476 <xsl:template match="/"> 477 <xsl:message terminate="yes">TEST TEST TEST</xsl:message> 478 </xsl:template> 479 </xsl:stylesheet> 480 ''' 481 482 source = self.parse(xml) 483 styledoc = self.parse(xslt) 484 style = etree.XSLT(styledoc) 485 result = style.apply(source) 486 self.assertEqual('', style.tostring(result)) 487 self.assertEqual('', str(result)) 488 self.assert_("TEST TEST TEST" in [entry.message 489 for entry in style.error_log])
490
491 - def test_xslt_shortcut(self):
492 tree = self.parse('<a><b>B</b><c>C</c></a>') 493 style = self.parse('''\ 494 <xsl:stylesheet version="1.0" 495 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 496 <xsl:template match="*" /> 497 <xsl:template match="/"> 498 <doc> 499 <foo><xsl:value-of select="$bar" /></foo> 500 <foo><xsl:value-of select="$baz" /></foo> 501 </doc> 502 </xsl:template> 503 </xsl:stylesheet>''') 504 505 result = tree.xslt(style, bar="'Bar'", baz="'Baz'") 506 self.assertEquals( 507 '<doc><foo>Bar</foo><foo>Baz</foo></doc>', 508 etree.tostring(result.getroot()))
509
510 - def test_multiple_elementrees(self):
511 tree = self.parse('<a><b>B</b><c>C</c></a>') 512 style = self.parse('''\ 513 <xsl:stylesheet version="1.0" 514 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 515 <xsl:template match="a"><A><xsl:apply-templates/></A></xsl:template> 516 <xsl:template match="b"><B><xsl:apply-templates/></B></xsl:template> 517 <xsl:template match="c"><C><xsl:apply-templates/></C></xsl:template> 518 </xsl:stylesheet>''') 519 520 self.assertEquals(self._rootstring(tree), 521 '<a><b>B</b><c>C</c></a>') 522 result = tree.xslt(style) 523 self.assertEquals(self._rootstring(tree), 524 '<a><b>B</b><c>C</c></a>') 525 self.assertEquals(self._rootstring(result), 526 '<A><B>B</B><C>C</C></A>') 527 528 b_tree = etree.ElementTree(tree.getroot()[0]) 529 self.assertEquals(self._rootstring(b_tree), 530 '<b>B</b>') 531 result = b_tree.xslt(style) 532 self.assertEquals(self._rootstring(tree), 533 '<a><b>B</b><c>C</c></a>') 534 self.assertEquals(self._rootstring(result), 535 '<B>B</B>') 536 537 c_tree = etree.ElementTree(tree.getroot()[1]) 538 self.assertEquals(self._rootstring(c_tree), 539 '<c>C</c>') 540 result = c_tree.xslt(style) 541 self.assertEquals(self._rootstring(tree), 542 '<a><b>B</b><c>C</c></a>') 543 self.assertEquals(self._rootstring(result), 544 '<C>C</C>')
545
546 - def test_extensions1(self):
547 tree = self.parse('<a><b>B</b></a>') 548 style = self.parse('''\ 549 <xsl:stylesheet version="1.0" 550 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 551 xmlns:myns="testns" 552 exclude-result-prefixes="myns"> 553 <xsl:template match="a"><A><xsl:value-of select="myns:mytext(b)"/></A></xsl:template> 554 </xsl:stylesheet>''') 555 556 def mytext(ctxt, values): 557 return 'X' * len(values)
558 559 result = tree.xslt(style, {('testns', 'mytext') : mytext}) 560 self.assertEquals(self._rootstring(result), 561 '<A>X</A>')
562
563 - def test_extensions2(self):
564 tree = self.parse('<a><b>B</b></a>') 565 style = self.parse('''\ 566 <xsl:stylesheet version="1.0" 567 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 568 xmlns:myns="testns" 569 exclude-result-prefixes="myns"> 570 <xsl:template match="a"><A><xsl:value-of select="myns:mytext(b)"/></A></xsl:template> 571 </xsl:stylesheet>''') 572 573 def mytext(ctxt, values): 574 return 'X' * len(values)
575 576 namespace = etree.FunctionNamespace('testns') 577 namespace['mytext'] = mytext 578 579 result = tree.xslt(style) 580 self.assertEquals(self._rootstring(result), 581 '<A>X</A>') 582
583 - def test_xslt_document_XML(self):
584 # make sure document('') works from parsed strings 585 xslt = etree.XSLT(etree.XML("""\ 586 <xsl:stylesheet version="1.0" 587 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 588 <xsl:template match="/"> 589 <test>TEXT<xsl:copy-of select="document('')//test"/></test> 590 </xsl:template> 591 </xsl:stylesheet> 592 """)) 593 result = xslt(etree.XML('<a/>')) 594 root = result.getroot() 595 self.assertEquals(root.tag, 596 'test') 597 self.assertEquals(root[0].tag, 598 'test') 599 self.assertEquals(root[0].text, 600 'TEXT') 601 self.assertEquals(root[0][0].tag, 602 '{http://www.w3.org/1999/XSL/Transform}copy-of')
603
604 - def test_xslt_document_parse(self):
605 # make sure document('') works from loaded files 606 xslt = etree.XSLT(etree.parse(fileInTestDir("test-document.xslt"))) 607 result = xslt(etree.XML('<a/>')) 608 root = result.getroot() 609 self.assertEquals(root.tag, 610 'test') 611 self.assertEquals(root[0].tag, 612 '{http://www.w3.org/1999/XSL/Transform}stylesheet')
613
614 - def test_xslt_document_elementtree(self):
615 # make sure document('') works from loaded files 616 xslt = etree.XSLT(etree.ElementTree(file=fileInTestDir("test-document.xslt"))) 617 result = xslt(etree.XML('<a/>')) 618 root = result.getroot() 619 self.assertEquals(root.tag, 620 'test') 621 self.assertEquals(root[0].tag, 622 '{http://www.w3.org/1999/XSL/Transform}stylesheet')
623
624 - def test_xslt_document_error(self):
625 # make sure document('') works from parsed strings 626 xslt = etree.XSLT(etree.XML("""\ 627 <xsl:stylesheet version="1.0" 628 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 629 <xsl:template match="/"> 630 <test>TEXT<xsl:copy-of select="document('uri:__junkfood__is__evil__')//test"/></test> 631 </xsl:template> 632 </xsl:stylesheet> 633 """)) 634 self.assertRaises(etree.XSLTApplyError, xslt, etree.XML('<a/>'))
635
636 - def test_xslt_move_result(self):
637 root = etree.XML('''\ 638 <transform> 639 <widget displayType="fieldset"/> 640 </transform>''') 641 642 xslt = etree.XSLT(etree.XML('''\ 643 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 644 <xsl:output method="html" indent="no"/> 645 <xsl:template match="/"> 646 <html> 647 <xsl:apply-templates/> 648 </html> 649 </xsl:template> 650 651 <xsl:template match="widget"> 652 <xsl:element name="{@displayType}"/> 653 </xsl:template> 654 655 </xsl:stylesheet>''')) 656 657 result = xslt(root[0]) 658 root[:] = result.getroot()[:] 659 del root # segfaulted before
660
661 - def test_xslt_pi(self):
662 tree = self.parse('''\ 663 <?xml version="1.0"?> 664 <?xml-stylesheet type="text/xsl" href="%s"?> 665 <a> 666 <b>B</b> 667 <c>C</c> 668 </a>''' % fileInTestDir("test1.xslt")) 669 670 style_root = tree.getroot().getprevious().parseXSL().getroot() 671 self.assertEquals("{http://www.w3.org/1999/XSL/Transform}stylesheet", 672 style_root.tag)
673
674 - def test_xslt_pi_embedded_xmlid(self):
675 # test xml:id dictionary lookup mechanism 676 tree = self.parse('''\ 677 <?xml version="1.0"?> 678 <?xml-stylesheet type="text/xsl" href="#style"?> 679 <a> 680 <b>B</b> 681 <c>C</c> 682 <xsl:stylesheet version="1.0" xml:id="style" 683 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 684 <xsl:template match="*" /> 685 <xsl:template match="/"> 686 <foo><xsl:value-of select="/a/b/text()" /></foo> 687 </xsl:template> 688 </xsl:stylesheet> 689 </a>''') 690 691 style_root = tree.getroot().getprevious().parseXSL().getroot() 692 self.assertEquals("{http://www.w3.org/1999/XSL/Transform}stylesheet", 693 style_root.tag) 694 695 st = etree.XSLT(style_root) 696 res = st.apply(tree) 697 self.assertEquals('''\ 698 <?xml version="1.0"?> 699 <foo>B</foo> 700 ''', 701 st.tostring(res))
702
703 - def test_xslt_pi_embedded_id(self):
704 # test XPath lookup mechanism 705 tree = self.parse('''\ 706 <?xml version="1.0"?> 707 <?xml-stylesheet type="text/xsl" href="#style"?> 708 <a> 709 <b>B</b> 710 <c>C</c> 711 </a>''') 712 713 style = self.parse('''\ 714 <xsl:stylesheet version="1.0" xml:id="style" 715 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 716 <xsl:template match="*" /> 717 <xsl:template match="/"> 718 <foo><xsl:value-of select="/a/b/text()" /></foo> 719 </xsl:template> 720 </xsl:stylesheet> 721 ''') 722 723 tree.getroot().append(style.getroot()) 724 725 style_root = tree.getroot().getprevious().parseXSL().getroot() 726 self.assertEquals("{http://www.w3.org/1999/XSL/Transform}stylesheet", 727 style_root.tag) 728 729 st = etree.XSLT(style_root) 730 res = st.apply(tree) 731 self.assertEquals('''\ 732 <?xml version="1.0"?> 733 <foo>B</foo> 734 ''', 735 st.tostring(res))
736
737 - def test_xslt_pi_get(self):
738 tree = self.parse('''\ 739 <?xml version="1.0"?> 740 <?xml-stylesheet type="text/xsl" href="TEST"?> 741 <a> 742 <b>B</b> 743 <c>C</c> 744 </a>''') 745 746 pi = tree.getroot().getprevious() 747 self.assertEquals("TEST", pi.get("href"))
748
749 - def test_xslt_pi_get_all(self):
750 tree = self.parse('''\ 751 <?xml version="1.0"?> 752 <?xml-stylesheet type="text/xsl" href="TEST"?> 753 <a> 754 <b>B</b> 755 <c>C</c> 756 </a>''') 757 758 pi = tree.getroot().getprevious() 759 self.assertEquals("TEST", pi.get("href")) 760 self.assertEquals("text/xsl", pi.get("type")) 761 self.assertEquals(None, pi.get("motz"))
762
763 - def test_xslt_pi_get_all_reversed(self):
764 tree = self.parse('''\ 765 <?xml version="1.0"?> 766 <?xml-stylesheet href="TEST" type="text/xsl"?> 767 <a> 768 <b>B</b> 769 <c>C</c> 770 </a>''') 771 772 pi = tree.getroot().getprevious() 773 self.assertEquals("TEST", pi.get("href")) 774 self.assertEquals("text/xsl", pi.get("type")) 775 self.assertEquals(None, pi.get("motz"))
776
777 - def test_xslt_pi_get_unknown(self):
778 tree = self.parse('''\ 779 <?xml version="1.0"?> 780 <?xml-stylesheet type="text/xsl" href="TEST"?> 781 <a> 782 <b>B</b> 783 <c>C</c> 784 </a>''') 785 786 pi = tree.getroot().getprevious() 787 self.assertEquals(None, pi.get("unknownattribute"))
788
789 - def test_xslt_pi_set_replace(self):
790 tree = self.parse('''\ 791 <?xml version="1.0"?> 792 <?xml-stylesheet type="text/xsl" href="TEST"?> 793 <a> 794 <b>B</b> 795 <c>C</c> 796 </a>''') 797 798 pi = tree.getroot().getprevious() 799 self.assertEquals("TEST", pi.get("href")) 800 801 pi.set("href", "TEST123") 802 self.assertEquals("TEST123", pi.get("href"))
803
804 - def test_xslt_pi_set_new(self):
805 tree = self.parse('''\ 806 <?xml version="1.0"?> 807 <?xml-stylesheet type="text/xsl"?> 808 <a> 809 <b>B</b> 810 <c>C</c> 811 </a>''') 812 813 pi = tree.getroot().getprevious() 814 self.assertEquals(None, pi.get("href")) 815 816 pi.set("href", "TEST") 817 self.assertEquals("TEST", pi.get("href"))
818
819 - def test_exslt_regexp_test(self):
820 xslt = etree.XSLT(etree.XML("""\ 821 <xsl:stylesheet version="1.0" 822 xmlns:regexp="http://exslt.org/regular-expressions" 823 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 824 <xsl:template match="*"> 825 <test><xsl:copy-of select="*[regexp:test(string(.), '8.')]"/></test> 826 </xsl:template> 827 </xsl:stylesheet> 828 """)) 829 result = xslt(etree.XML('<a><b>123</b><b>098</b><b>987</b></a>')) 830 root = result.getroot() 831 self.assertEquals(root.tag, 832 'test') 833 self.assertEquals(len(root), 1) 834 self.assertEquals(root[0].tag, 835 'b') 836 self.assertEquals(root[0].text, 837 '987')
838
839 - def test_exslt_regexp_replace(self):
840 xslt = etree.XSLT(etree.XML("""\ 841 <xsl:stylesheet version="1.0" 842 xmlns:regexp="http://exslt.org/regular-expressions" 843 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 844 <xsl:template match="*"> 845 <test> 846 <xsl:copy-of select="regexp:replace(string(.), 'd.', '', 'XX')"/> 847 <xsl:text>-</xsl:text> 848 <xsl:copy-of select="regexp:replace(string(.), 'd.', 'gi', 'XX')"/> 849 </test> 850 </xsl:template> 851 </xsl:stylesheet> 852 """)) 853 result = xslt(etree.XML('<a>abdCdEeDed</a>')) 854 root = result.getroot() 855 self.assertEquals(root.tag, 856 'test') 857 self.assertEquals(len(root), 0) 858 self.assertEquals(root.text, 'abXXdEeDed-abXXXXeXXd')
859
860 - def test_exslt_regexp_match(self):
861 xslt = etree.XSLT(etree.XML("""\ 862 <xsl:stylesheet version="1.0" 863 xmlns:regexp="http://exslt.org/regular-expressions" 864 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 865 <xsl:template match="*"> 866 <test> 867 <test1><xsl:copy-of select="regexp:match(string(.), 'd.')"/></test1> 868 <test2><xsl:copy-of select="regexp:match(string(.), 'd.', 'g')"/></test2> 869 <test2i><xsl:copy-of select="regexp:match(string(.), 'd.', 'gi')"/></test2i> 870 </test> 871 </xsl:template> 872 </xsl:stylesheet> 873 """)) 874 result = xslt(etree.XML('<a>abdCdEeDed</a>')) 875 root = result.getroot() 876 self.assertEquals(root.tag, 'test') 877 self.assertEquals(len(root), 3) 878 879 self.assertEquals(len(root[0]), 1) 880 self.assertEquals(root[0][0].tag, 'match') 881 self.assertEquals(root[0][0].text, 'dC') 882 883 self.assertEquals(len(root[1]), 2) 884 self.assertEquals(root[1][0].tag, 'match') 885 self.assertEquals(root[1][0].text, 'dC') 886 self.assertEquals(root[1][1].tag, 'match') 887 self.assertEquals(root[1][1].text, 'dE') 888 889 self.assertEquals(len(root[2]), 3) 890 self.assertEquals(root[2][0].tag, 'match') 891 self.assertEquals(root[2][0].text, 'dC') 892 self.assertEquals(root[2][1].tag, 'match') 893 self.assertEquals(root[2][1].text, 'dE') 894 self.assertEquals(root[2][2].tag, 'match') 895 self.assertEquals(root[2][2].text, 'De')
896
897 - def test_exslt_regexp_match_groups(self):
898 xslt = etree.XSLT(etree.XML("""\ 899 <xsl:stylesheet version="1.0" 900 xmlns:regexp="http://exslt.org/regular-expressions" 901 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 902 <xsl:template match="/"> 903 <test> 904 <xsl:for-each select="regexp:match( 905 '123abc567', '([0-9]+)([a-z]+)([0-9]+)' )"> 906 <test1><xsl:value-of select="."/></test1> 907 </xsl:for-each> 908 </test> 909 </xsl:template> 910 </xsl:stylesheet> 911 """)) 912 result = xslt(etree.XML('<a/>')) 913 root = result.getroot() 914 self.assertEquals(root.tag, 'test') 915 self.assertEquals(len(root), 4) 916 917 self.assertEquals(root[0].text, "123abc567") 918 self.assertEquals(root[1].text, "123") 919 self.assertEquals(root[2].text, "abc") 920 self.assertEquals(root[3].text, "567")
921
922 - def test_exslt_regexp_match1(self):
923 # taken from http://www.exslt.org/regexp/functions/match/index.html 924 xslt = etree.XSLT(etree.XML("""\ 925 <xsl:stylesheet version="1.0" 926 xmlns:regexp="http://exslt.org/regular-expressions" 927 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 928 <xsl:template match="/"> 929 <test> 930 <xsl:for-each select="regexp:match( 931 'http://www.bayes.co.uk/xml/index.xml?/xml/utils/rechecker.xml', 932 '(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)')"> 933 <test1><xsl:value-of select="."/></test1> 934 </xsl:for-each> 935 </test> 936 </xsl:template> 937 </xsl:stylesheet> 938 """)) 939 result = xslt(etree.XML('<a/>')) 940 root = result.getroot() 941 self.assertEquals(root.tag, 'test') 942 self.assertEquals(len(root), 5) 943 944 self.assertEquals( 945 root[0].text, 946 "http://www.bayes.co.uk/xml/index.xml?/xml/utils/rechecker.xml") 947 self.assertEquals( 948 root[1].text, 949 "http") 950 self.assertEquals( 951 root[2].text, 952 "www.bayes.co.uk") 953 self.assertFalse(root[3].text) 954 self.assertEquals( 955 root[4].text, 956 "/xml/index.xml?/xml/utils/rechecker.xml")
957
958 - def test_exslt_regexp_match2(self):
959 # taken from http://www.exslt.org/regexp/functions/match/index.html 960 xslt = etree.XSLT(etree.XML("""\ 961 <xsl:stylesheet version="1.0" 962 xmlns:regexp="http://exslt.org/regular-expressions" 963 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 964 <xsl:template match="/"> 965 <test> 966 <xsl:for-each select="regexp:match( 967 'This is a test string', '(\w+)', 'g')"> 968 <test1><xsl:value-of select="."/></test1> 969 </xsl:for-each> 970 </test> 971 </xsl:template> 972 </xsl:stylesheet> 973 """)) 974 result = xslt(etree.XML('<a/>')) 975 root = result.getroot() 976 self.assertEquals(root.tag, 'test') 977 self.assertEquals(len(root), 5) 978 979 self.assertEquals(root[0].text, "This") 980 self.assertEquals(root[1].text, "is") 981 self.assertEquals(root[2].text, "a") 982 self.assertEquals(root[3].text, "test") 983 self.assertEquals(root[4].text, "string")
984
985 - def _test_exslt_regexp_match3(self):
986 # taken from http://www.exslt.org/regexp/functions/match/index.html 987 # THIS IS NOT SUPPORTED! 988 xslt = etree.XSLT(etree.XML("""\ 989 <xsl:stylesheet version="1.0" 990 xmlns:regexp="http://exslt.org/regular-expressions" 991 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 992 <xsl:template match="/"> 993 <test> 994 <xsl:for-each select="regexp:match( 995 'This is a test string', '([a-z])+ ', 'g')"> 996 <test1><xsl:value-of select="."/></test1> 997 </xsl:for-each> 998 </test> 999 </xsl:template> 1000 </xsl:stylesheet> 1001 """)) 1002 result = xslt(etree.XML('<a/>')) 1003 root = result.getroot() 1004 self.assertEquals(root.tag, 'test') 1005 self.assertEquals(len(root), 4) 1006 1007 self.assertEquals(root[0].text, "his") 1008 self.assertEquals(root[1].text, "is") 1009 self.assertEquals(root[2].text, "a") 1010 self.assertEquals(root[3].text, "test")
1011
1012 - def _test_exslt_regexp_match4(self):
1013 # taken from http://www.exslt.org/regexp/functions/match/index.html 1014 # THIS IS NOT SUPPORTED! 1015 xslt = etree.XSLT(etree.XML("""\ 1016 <xsl:stylesheet version="1.0" 1017 xmlns:regexp="http://exslt.org/regular-expressions" 1018 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 1019 <xsl:template match="/"> 1020 <test> 1021 <xsl:for-each select="regexp:match( 1022 'This is a test string', '([a-z])+ ', 'gi')"> 1023 <test1><xsl:value-of select="."/></test1> 1024 </xsl:for-each> 1025 </test> 1026 </xsl:template> 1027 </xsl:stylesheet> 1028 """)) 1029 result = xslt(etree.XML('<a/>')) 1030 root = result.getroot() 1031 self.assertEquals(root.tag, 'test') 1032 self.assertEquals(len(root), 4) 1033 1034 self.assertEquals(root[0].text, "This") 1035 self.assertEquals(root[1].text, "is") 1036 self.assertEquals(root[2].text, "a") 1037 self.assertEquals(root[3].text, "test")
1038
1039 -def test_suite():
1040 suite = unittest.TestSuite() 1041 suite.addTests([unittest.makeSuite(ETreeXSLTTestCase)]) 1042 suite.addTests( 1043 [doctest.DocFileSuite('../../../doc/extensions.txt')]) 1044 suite.addTests( 1045 [doctest.DocFileSuite('../../../doc/xpathxslt.txt')]) 1046 return suite
1047 1048 if __name__ == '__main__': 1049 print 'to test use test.py %s' % __file__ 1050