1
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
13 """XPath tests etree"""
14
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
36
39
40 if False and etree.LIBXSLT_VERSION >= (1,1,15):
41
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
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
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
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
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
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
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
233
250
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
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
282
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
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
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
382
388
411
436
438
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
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
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
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
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
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
584
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
613
623
625
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
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
660
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
675
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
704
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
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
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
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
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
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
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
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
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
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
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
923
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
959
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
986
987
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
1013
1014
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
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