Code

Modified filter rendering area handling to better accommodate upcoming feOffset
[inkscape.git] / src / dom / work / xpathtests.cpp
1 /**
2  * Phoebe DOM Implementation.
3  *
4  * This is a C++ approximation of the W3C DOM model, which follows
5  * fairly closely the specifications in the various .idl files, copies of
6  * which are provided for reference.  Most important is this one:
7  *
8  * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html
9  *
10  * Authors:
11  *   Bob Jamison
12  *
13  * Copyright (C) 2005 Bob Jamison
14  *
15  *  This library is free software; you can redistribute it and/or
16  *  modify it under the terms of the GNU Lesser General Public
17  *  License as published by the Free Software Foundation; either
18  *  version 2.1 of the License, or (at your option) any later version.
19  *
20  *  This library is distributed in the hope that it will be useful,
21  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
22  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23  *  Lesser General Public License for more details.
24  *
25  *  You should have received a copy of the GNU Lesser General Public
26  *  License along with this library; if not, write to the Free Software
27  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
28  */
32 typedef struct
33 {
34     char *xpathStr;
35     char *desc;
36     char *xml;
37 } XpathTest;
39 XpathTest xpathTests[] =
40 {
42 {
43 "/AAA",
44 "Select the root element AAA",
45 "     <AAA>"
46 "          <BBB/>"
47 "          <CCC/>"
48 "          <BBB/>"
49 "          <BBB/>"
50 "          <DDD>"
51 "               <BBB/>"
52 "          </DDD>"
53 "          <CCC/>"
54 "     </AAA>"
55 },
57 {
58 "/AAA/CCC",
59 "Select all elements CCC which are children of the root element AAA",
60 "     <AAA>"
61 "          <BBB/>"
62 "          <CCC/>"
63 "          <BBB/>"
64 "          <BBB/>"
65 "          <DDD>"
66 "               <BBB/>"
67 "          </DDD>"
68 "          <CCC/>"
69 "     </AAA>"
70 },
72 {
73 "/AAA/DDD/BBB",
74 "Select all elements BBB which are children of DDD which are children of the root element AAA",
75 "     <AAA>"
76 "          <BBB/>"
77 "          <CCC/>"
78 "          <BBB/>"
79 "          <BBB/>"
80 "          <DDD>"
81 "               <BBB/>"
82 "          </DDD>"
83 "          <CCC/>"
84 "     </AAA>"
85 "//BBB",
86 },
88 {
89 "Select all elements BBB",
90 "     <AAA>"
91 "          <BBB/>"
92 "          <CCC/>"
93 "          <BBB/>"
94 "          <DDD>"
95 "               <BBB/>"
96 "          </DDD>"
97 "          <CCC>"
98 "               <DDD>"
99 "                    <BBB/>"
100 "                    <BBB/>"
101 "               </DDD>"
102 "          </CCC>"
103 "     </AAA>"
104 },
107 "//DDD/BBB",
108 "Select all elements BBB which are children of DDD",
109 "     <AAA>"
110 "          <BBB/>"
111 "          <CCC/>"
112 "          <BBB/>"
113 "          <DDD>"
114 "               <BBB/>"
115 "          </DDD>"
116 "          <CCC>"
117 "               <DDD>"
118 "                    <BBB/>"
119 "                    <BBB/>"
120 "               </DDD>"
121 "          </CCC>"
122 "     </AAA>"
123 },
126 "/AAA/CCC/DDD/*",
127 "Select all elements enclosed by elements /AAA/CCC/DDD",
128 "     <AAA>"
129 "          <XXX>"
130 "               <DDD>"
131 "                    <BBB/>"
132 "                    <BBB/>"
133 "                    <EEE/>"
134 "                    <FFF/>"
135 "               </DDD>"
136 "          </XXX>"
137 "          <CCC>"
138 "               <DDD>"
139 "                    <BBB/>"
140 "                    <BBB/>"
141 "                    <EEE/>"
142 "                    <FFF/>"
143 "               </DDD>"
144 "          </CCC>"
145 "          <CCC>"
146 "               <BBB>"
147 "                    <BBB>"
148 "                         <BBB/>"
149 "                    </BBB>"
150 "               </BBB>"
151 "          </CCC>"
152 "     </AAA>"
153 },
156 "/*/*/*/BBB",
157 "Select all elements BBB which have 3 ancestors",
158 "     <AAA>"
159 "          <XXX>"
160 "               <DDD>"
161 "                    <BBB/>"
162 "                    <BBB/>"
163 "                    <EEE/>"
164 "                    <FFF/>"
165 "               </DDD>"
166 "          </XXX>"
167 "          <CCC>"
168 "               <DDD>"
169 "                    <BBB/>"
170 "                    <BBB/>"
171 "                    <EEE/>"
172 "                    <FFF/>"
173 "               </DDD>"
174 "          </CCC>"
175 "          <CCC>"
176 "               <BBB>"
177 "                    <BBB>"
178 "                         <BBB/>"
179 "                    </BBB>"
180 "               </BBB>"
181 "          </CCC>"
182 "     </AAA>"
183 },
186 "//*",
187 "Select all elements",
188 "     <AAA>"
189 "          <XXX>"
190 "               <DDD>"
191 "                    <BBB/>"
192 "                    <BBB/>"
193 "                    <EEE/>"
194 "                    <FFF/>"
195 "               </DDD>"
196 "          </XXX>"
197 "          <CCC>"
198 "               <DDD>"
199 "                    <BBB/>"
200 "                    <BBB/>"
201 "                    <EEE/>"
202 "                    <FFF/>"
203 "               </DDD>"
204 "          </CCC>"
205 "          <CCC>"
206 "               <BBB>"
207 "                    <BBB>"
208 "                         <BBB/>"
209 "                    </BBB>"
210 "               </BBB>"
211 "          </CCC>"
212 "     </AAA>"
213 },
216 "/AAA/BBB[1]",
217 "Select the first BBB child of element AAA",
218 "     <AAA>"
219 "          <BBB/>"
220 "          <BBB/>"
221 "          <BBB/>"
222 "          <BBB/>"
223 "     </AAA>"
224 },
227 "/AAA/BBB[last()]",
228 "Select the last BBB child of element AAA",
229 "     <AAA>"
230 "          <BBB/>"
231 "          <BBB/>"
232 "          <BBB/>"
233 "          <BBB/>"
234 "     </AAA>"
235 },
238 "//@id",
239 "Select all attributes @id",
240 "     <AAA>"
241 "          <BBB id = 'b1'/>"
242 "          <BBB id = 'b2'/>"
243 "          <BBB name = 'bbb'/>"
244 "          <BBB/>"
245 "     </AAA>"
246 },
249 "//BBB[@id]",
250 "Select BBB elements which have attribute id",
251 "     <AAA>"
252 "          <BBB id = 'b1'/>"
253 "          <BBB id = 'b2'/>"
254 "          <BBB name = 'bbb'/>"
255 "          <BBB/>"
256 "     </AAA>"
257 },
260 "//BBB[@name]",
261 "Select BBB elements which have attribute name",
262 "     <AAA>"
263 "          <BBB id = 'b1'/>"
264 "          <BBB id = 'b2'/>"
265 "          <BBB name = 'bbb'/>"
266 "          <BBB/>"
267 "     </AAA>"
268 },
271 "//BBB[@*]",
272 "Select BBB elements which have any attribute",
273 "     <AAA>"
274 "          <BBB id = 'b1'/>"
275 "          <BBB id = 'b2'/>"
276 "          <BBB name = 'bbb'/>"
277 "          <BBB/>"
278 "     </AAA>"
279 },
282 "//BBB[not(@*)]",
283 "Select BBB elements without an attribute",
284 "     <AAA>"
285 "          <BBB id = 'b1'/>"
286 "          <BBB id = 'b2'/>"
287 "          <BBB name = 'bbb'/>"
288 "          <BBB/>"
289 "     </AAA>"
290 },
293 "//BBB[@id='b1']",
294 "Select BBB elements which have attribute id with value b1",
295 "     <AAA>"
296 "          <BBB id = 'b1'/>"
297 "          <BBB name = ' bbb '/>"
298 "          <BBB name = 'bbb'/>"
299 "     </AAA>"
300 },
303 "//BBB[@name='bbb']",
304 "Select BBB elements which have attribute name with value 'bbb'",
305 "     <AAA>"
306 "          <BBB id = 'b1'/>"
307 "          <BBB name = ' bbb '/>"
308 "          <BBB name = 'bbb'/>"
309 "     </AAA>"
310 },
313 "//BBB[normalize-space(@name)='bbb']",
314 "Select BBB elements which have attribute name with value bbb, leading and trailing spaces are removed before comparison",
315 "     <AAA>"
316 "          <BBB id = 'b1'/>"
317 "          <BBB name = ' bbb '/>"
318 "          <BBB name = 'bbb'/>"
319 "     </AAA>"
320 },
323 "//*[count(BBB)=2]",
324 "Select elements which have two children BBB",
325 "     <AAA>"
326 "          <CCC>"
327 "               <BBB/>"
328 "               <BBB/>"
329 "               <BBB/>"
330 "          </CCC>"
331 "          <DDD>"
332 "               <BBB/>"
333 "               <BBB/>"
334 "          </DDD>"
335 "          <EEE>"
336 "               <CCC/>"
337 "               <DDD/>"
338 "          </EEE>"
339 "     </AAA>"
340 },
343 "//*[count(*)=2]",
344 "Select elements which have 2 children",
345 "     <AAA>"
346 "          <CCC>"
347 "               <BBB/>"
348 "               <BBB/>"
349 "               <BBB/>"
350 "          </CCC>"
351 "          <DDD>"
352 "               <BBB/>"
353 "               <BBB/>"
354 "          </DDD>"
355 "          <EEE>"
356 "               <CCC/>"
357 "               <DDD/>"
358 "          </EEE>"
359 "     </AAA>"
360 },
363 "//*[count(*)=3]",
364 "Select elements which have 3 children",
365 "     <AAA>"
366 "          <CCC>"
367 "               <BBB/>"
368 "               <BBB/>"
369 "               <BBB/>"
370 "          </CCC>"
371 "          <DDD>"
372 "               <BBB/>"
373 "               <BBB/>"
374 "          </DDD>"
375 "          <EEE>"
376 "               <CCC/>"
377 "               <DDD/>"
378 "          </EEE>"
379 "     </AAA>"
380 },
383 "//*[name()='BBB']",
384 "Select all elements with name BBB, equivalent with //BBB",
385 "     <AAA>"
386 "          <BCC>"
387 "               <BBB/>"
388 "               <BBB/>"
389 "               <BBB/>"
390 "          </BCC>"
391 "          <DDB>"
392 "               <BBB/>"
393 "               <BBB/>"
394 "          </DDB>"
395 "          <BEC>"
396 "               <CCC/>"
397 "               <DBD/>"
398 "          </BEC>"
399 "     </AAA>"
400 },
403 "//*[starts-with(name(),'B')]",
404 "Select all elements name of which starts with letter B",
405 "     <AAA>"
406 "          <BCC>"
407 "               <BBB/>"
408 "               <BBB/>"
409 "               <BBB/>"
410 "          </BCC>"
411 "          <DDB>"
412 "               <BBB/>"
413 "               <BBB/>"
414 "          </DDB>"
415 "          <BEC>"
416 "               <CCC/>"
417 "               <DBD/>"
418 "          </BEC>"
419 "     </AAA>"
420 },
423 "//*[contains(name(),'C')]",
424 "Select all elements name of which contain letter C",
425 "     <AAA>"
426 "          <BCC>"
427 "               <BBB/>"
428 "               <BBB/>"
429 "               <BBB/>"
430 "          </BCC>"
431 "          <DDB>"
432 "               <BBB/>"
433 "               <BBB/>"
434 "          </DDB>"
435 "          <BEC>"
436 "               <CCC/>"
437 "               <DBD/>"
438 "          </BEC>"
439 "     </AAA>"
440 },
443 "//*[string-length(name()) = 3]",
444 "Select elements with three-letter name",
445 "     <AAA>"
446 "          <Q/>"
447 "          <SSSS/>"
448 "          <BB/>"
449 "          <CCC/>"
450 "          <DDDDDDDD/>"
451 "          <EEEE/>"
452 "     </AAA>"
453 },
456 "//*[string-length(name()) < 3]",
457 "Select elements name of which has one or two characters",
458 "     <AAA>"
459 "          <Q/>"
460 "          <SSSS/>"
461 "          <BB/>"
462 "          <CCC/>"
463 "          <DDDDDDDD/>"
464 "          <EEEE/>"
465 "     </AAA>"
466 },
469 "//*[string-length(name()) > 3]",
470 "Select elements with name longer than three characters",
471 "     <AAA>"
472 "          <Q/>"
473 "          <SSSS/>"
474 "          <BB/>"
475 "          <CCC/>"
476 "          <DDDDDDDD/>"
477 "          <EEEE/>"
478 "     </AAA>"
479 },
482 "//CCC | //BBB",
483 "Select all elements CCC and BBB",
484 "     <AAA>"
485 "          <BBB/>"
486 "          <CCC/>"
487 "          <DDD>"
488 "               <CCC/>"
489 "          </DDD>"
490 "          <EEE/>"
491 "     </AAA>"
492 },
495 "/AAA/EEE | //BBB",
496 "Select all elements BBB and elements EEE which are children of root element AAA",
497 "     <AAA>"
498 "          <BBB/>"
499 "          <CCC/>"
500 "          <DDD>"
501 "               <CCC/>"
502 "          </DDD>"
503 "          <EEE/>"
504 "     </AAA>"
505 },
508 "/AAA/EEE | //DDD/CCC | /AAA | //BBB",
509 "Number of combinations is not restricted",
510 "     <AAA>"
511 "          <BBB/>"
512 "          <CCC/>"
513 "          <DDD>"
514 "               <CCC/>"
515 "          </DDD>"
516 "          <EEE/>"
517 "     </AAA>"
518 },
521 "/AAA",
522 "Equivalent of /child::AAA",
523 "     <AAA>"
524 "          <BBB/>"
525 "          <CCC/>"
526 "     </AAA>"
527 },
530 "/child::AAA",
531 "Equivalent of /AAA",
532 "     <AAA>"
533 "          <BBB/>"
534 "          <CCC/>"
535 "     </AAA>"
536 },
539 "/AAA/BBB",
540 "Equivalent of /child::AAA/child::BBB",
541 "     <AAA>"
542 "          <BBB/>"
543 "          <CCC/>"
544 "     </AAA>"
545 },
548 "/child::AAA/child::BBB",
549 "Equivalent of /AAA/BBB",
550 "     <AAA>"
551 "          <BBB/>"
552 "          <CCC/>"
553 "     </AAA>"
554 },
557 "/child::AAA/BBB",
558 "Both possibilities can be combined",
559 "     <AAA>"
560 "          <BBB/>"
561 "          <CCC/>"
562 "     </AAA>"
563 },
566 "/descendant::*",
567 "Select all descendants of document root and therefore all elements",
568 "     <AAA>"
569 "          <BBB>"
570 "               <DDD>"
571 "                    <CCC>"
572 "                         <DDD/>"
573 "                         <EEE/>"
574 "                    </CCC>"
575 "               </DDD>"
576 "          </BBB>"
577 "          <CCC>"
578 "               <DDD>"
579 "                    <EEE>"
580 "                         <DDD>"
581 "                              <FFF/>"
582 "                         </DDD>"
583 "                    </EEE>"
584 "               </DDD>"
585 "          </CCC>"
586 "     </AAA>"
587 },
590 "/AAA/BBB/descendant::*",
591 "Select all descendants of /AAA/BBB",
592 "     <AAA>"
593 "          <BBB>"
594 "               <DDD>"
595 "                    <CCC>"
596 "                         <DDD/>"
597 "                         <EEE/>"
598 "                    </CCC>"
599 "               </DDD>"
600 "          </BBB>"
601 "          <CCC>"
602 "               <DDD>"
603 "                    <EEE>"
604 "                         <DDD>"
605 "                              <FFF/>"
606 "                         </DDD>"
607 "                    </EEE>"
608 "               </DDD>"
609 "          </CCC>"
610 "     </AAA>"
611 },
614 "//CCC/descendant::*",
615 "Select all elements which have CCC among its ancestors",
616 "     <AAA>"
617 "          <BBB>"
618 "               <DDD>"
619 "                    <CCC>"
620 "                         <DDD/>"
621 "                         <EEE/>"
622 "                    </CCC>"
623 "               </DDD>"
624 "          </BBB>"
625 "          <CCC>"
626 "               <DDD>"
627 "                    <EEE>"
628 "                         <DDD>"
629 "                              <FFF/>"
630 "                         </DDD>"
631 "                    </EEE>"
632 "               </DDD>"
633 "          </CCC>"
634 "     </AAA>"
635 },
638 "//CCC/descendant::DDD",
639 "Select elements DDD which have CCC among its ancestors",
640 "     <AAA>"
641 "          <BBB>"
642 "               <DDD>"
643 "                    <CCC>"
644 "                         <DDD/>"
645 "                         <EEE/>"
646 "                    </CCC>"
647 "               </DDD>"
648 "          </BBB>"
649 "          <CCC>"
650 "               <DDD>"
651 "                    <EEE>"
652 "                         <DDD>"
653 "                              <FFF/>"
654 "                         </DDD>"
655 "                    </EEE>"
656 "               </DDD>"
657 "          </CCC>"
658 "     </AAA>"
659 },
662 "//DDD/parent::*",
663 "Select all parents of DDD element",
664 "     <AAA>"
665 "          <BBB>"
666 "               <DDD>"
667 "                    <CCC>"
668 "                         <DDD/>"
669 "                         <EEE/>"
670 "                    </CCC>"
671 "               </DDD>"
672 "          </BBB>"
673 "          <CCC>"
674 "               <DDD>"
675 "                    <EEE>"
676 "                         <DDD>"
677 "                              <FFF/>"
678 "                         </DDD>"
679 "                    </EEE>"
680 "               </DDD>"
681 "          </CCC>"
682 "     </AAA>"
683 },
686 "/AAA/BBB/DDD/CCC/EEE/ancestor::*",
687 "Select all elements given in this absolute path",
688 "     <AAA>"
689 "          <BBB>"
690 "               <DDD>"
691 "                    <CCC>"
692 "                         <DDD/>"
693 "                         <EEE/>"
694 "                    </CCC>"
695 "               </DDD>"
696 "          </BBB>"
697 "          <CCC>"
698 "               <DDD>"
699 "                    <EEE>"
700 "                         <DDD>"
701 "                              <FFF/>"
702 "                         </DDD>"
703 "                    </EEE>"
704 "               </DDD>"
705 "          </CCC>"
706 "     </AAA>"
707 },
710 "//FFF/ancestor::*",
711 "Select ancestors of FFF element",
712 "     <AAA>"
713 "          <BBB>"
714 "               <DDD>"
715 "                    <CCC>"
716 "                         <DDD/>"
717 "                         <EEE/>"
718 "                    </CCC>"
719 "               </DDD>"
720 "          </BBB>"
721 "          <CCC>"
722 "               <DDD>"
723 "                    <EEE>"
724 "                         <DDD>"
725 "                              <FFF/>"
726 "                         </DDD>"
727 "                    </EEE>"
728 "               </DDD>"
729 "          </CCC>"
730 "     </AAA>"
731 },
734 "/AAA/BBB/following-sibling::*",
735 "The following-sibling axis contains all the following siblings of the context node.",
736 "     <AAA>"
737 "          <BBB>"
738 "               <CCC/>"
739 "               <DDD/>"
740 "          </BBB>"
741 "          <XXX>"
742 "               <DDD>"
743 "                    <EEE/>"
744 "                    <DDD/>"
745 "                    <CCC/>"
746 "                    <FFF/>"
747 "                    <FFF>"
748 "                         <GGG/>"
749 "                    </FFF>"
750 "               </DDD>"
751 "          </XXX>"
752 "          <CCC>"
753 "               <DDD/>"
754 "          </CCC>"
755 "     </AAA>"
756 },
759 "//CCC/following-sibling::*",
760 "The following-sibling axis contains all the following siblings of the context node.",
761 "     <AAA>"
762 "          <BBB>"
763 "               <CCC/>"
764 "               <DDD/>"
765 "          </BBB>"
766 "          <XXX>"
767 "               <DDD>"
768 "                    <EEE/>"
769 "                    <DDD/>"
770 "                    <CCC/>"
771 "                    <FFF/>"
772 "                    <FFF>"
773 "                         <GGG/>"
774 "                    </FFF>"
775 "               </DDD>"
776 "          </XXX>"
777 "          <CCC>"
778 "               <DDD/>"
779 "          </CCC>"
780 "     </AAA>"
781 },
784 "/AAA/XXX/preceding-sibling::*",
785 "The preceding-sibling axis contains all the preceding siblings of the context node.",
786 "     <AAA>"
787 "          <BBB>"
788 "               <CCC/>"
789 "               <DDD/>"
790 "          </BBB>"
791 "          <XXX>"
792 "               <DDD>"
793 "                    <EEE/>"
794 "                    <DDD/>"
795 "                    <CCC/>"
796 "                    <FFF/>"
797 "                    <FFF>"
798 "                         <GGG/>"
799 "                    </FFF>"
800 "               </DDD>"
801 "          </XXX>"
802 "          <CCC>"
803 "               <DDD/>"
804 "          </CCC>"
805 "     </AAA>"
806 },
809 "//CCC/preceding-sibling::*",
810 "     <AAA>"
811 "          <BBB>"
812 "               <CCC/>"
813 "               <DDD/>"
814 "          </BBB>"
815 "          <XXX>"
816 "               <DDD>"
817 "                    <EEE/>"
818 "                    <DDD/>"
819 "                    <CCC/>"
820 "                    <FFF/>"
821 "                    <FFF>"
822 "                         <GGG/>"
823 "                    </FFF>"
824 "               </DDD>"
825 "          </XXX>"
826 "          <CCC>"
827 "               <DDD/>"
828 "          </CCC>"
829 "     </AAA>"
830 },
833 "/AAA/XXX/following::*",
834 "Description",
835 "     <AAA>"
836 "          <BBB>"
837 "               <CCC/>"
838 "               <ZZZ>"
839 "                    <DDD/>"
840 "                    <DDD>"
841 "                         <EEE/>"
842 "                    </DDD>"
843 "               </ZZZ>"
844 "               <FFF>"
845 "                    <GGG/>"
846 "               </FFF>"
847 "          </BBB>"
848 "          <XXX>"
849 "               <DDD>"
850 "                    <EEE/>"
851 "                    <DDD/>"
852 "                    <CCC/>"
853 "                    <FFF/>"
854 "                    <FFF>"
855 "                         <GGG/>"
856 "                    </FFF>"
857 "               </DDD>"
858 "          </XXX>"
859 "          <CCC>"
860 "               <DDD/>"
861 "          </CCC>"
862 "     </AAA>"
863 },
866 "//ZZZ/following::*",
867 "Description",
868 "     <AAA>"
869 "          <BBB>"
870 "               <CCC/>"
871 "               <ZZZ>"
872 "                    <DDD/>"
873 "                    <DDD>"
874 "                         <EEE/>"
875 "                    </DDD>"
876 "               </ZZZ>"
877 "               <FFF>"
878 "                    <GGG/>"
879 "               </FFF>"
880 "          </BBB>"
881 "          <XXX>"
882 "               <DDD>"
883 "                    <EEE/>"
884 "                    <DDD/>"
885 "                    <CCC/>"
886 "                    <FFF/>"
887 "                    <FFF>"
888 "                         <GGG/>"
889 "                    </FFF>"
890 "               </DDD>"
891 "          </XXX>"
892 "          <CCC>"
893 "               <DDD/>"
894 "          </CCC>"
895 "     </AAA>"
896 },
899 "/AAA/XXX/preceding::*",
900 "Description",
901 "     <AAA>"
902 "          <BBB>"
903 "               <CCC/>"
904 "               <ZZZ>"
905 "                    <DDD/>"
906 "               </ZZZ>"
907 "          </BBB>"
908 "          <XXX>"
909 "               <DDD>"
910 "                    <EEE/>"
911 "                    <DDD/>"
912 "                    <CCC/>"
913 "                    <FFF/>"
914 "                    <FFF>"
915 "                         <GGG/>"
916 "                    </FFF>"
917 "               </DDD>"
918 "          </XXX>"
919 "          <CCC>"
920 "               <DDD/>"
921 "          </CCC>"
922 "     </AAA>"
923 },
926 "//GGG/preceding::*",
927 "Description",
928 "     <AAA>"
929 "          <BBB>"
930 "               <CCC/>"
931 "               <ZZZ>"
932 "                    <DDD/>"
933 "               </ZZZ>"
934 "          </BBB>"
935 "          <XXX>"
936 "               <DDD>"
937 "                    <EEE/>"
938 "                    <DDD/>"
939 "                    <CCC/>"
940 "                    <FFF/>"
941 "                    <FFF>"
942 "                         <GGG/>"
943 "                    </FFF>"
944 "               </DDD>"
945 "          </XXX>"
946 "          <CCC>"
947 "               <DDD/>"
948 "          </CCC>"
949 "     </AAA>"
950 },
953 "/AAA/XXX/descendant-or-self::*",
954 "Description",
955 "     <AAA>"
956 "          <BBB>"
957 "               <CCC/>"
958 "               <ZZZ>"
959 "                    <DDD/>"
960 "               </ZZZ>"
961 "          </BBB>"
962 "          <XXX>"
963 "               <DDD>"
964 "                    <EEE/>"
965 "                    <DDD/>"
966 "                    <CCC/>"
967 "                    <FFF/>"
968 "                    <FFF>"
969 "                         <GGG/>"
970 "                    </FFF>"
971 "               </DDD>"
972 "          </XXX>"
973 "          <CCC>"
974 "               <DDD/>"
975 "          </CCC>"
976 "     </AAA>"
977 },
980 "//CCC/descendant-or-self::*",
981 "Description",
982 "     <AAA>"
983 "          <BBB>"
984 "               <CCC/>"
985 "               <ZZZ>"
986 "                    <DDD/>"
987 "               </ZZZ>"
988 "          </BBB>"
989 "          <XXX>"
990 "               <DDD>"
991 "                    <EEE/>"
992 "                    <DDD/>"
993 "                    <CCC/>"
994 "                    <FFF/>"
995 "                    <FFF>"
996 "                         <GGG/>"
997 "                    </FFF>"
998 "               </DDD>"
999 "          </XXX>"
1000 "          <CCC>"
1001 "               <DDD/>"
1002 "          </CCC>"
1003 "     </AAA>"
1004 },
1007 "/AAA/XXX/DDD/EEE/ancestor-or-self::*",
1008 "Description",
1009 "     <AAA>"
1010 "          <BBB>"
1011 "               <CCC/>"
1012 "               <ZZZ>"
1013 "                    <DDD/>"
1014 "               </ZZZ>"
1015 "          </BBB>"
1016 "          <XXX>"
1017 "               <DDD>"
1018 "                    <EEE/>"
1019 "                    <DDD/>"
1020 "                    <CCC/>"
1021 "                    <FFF/>"
1022 "                    <FFF>"
1023 "                         <GGG/>"
1024 "                    </FFF>"
1025 "               </DDD>"
1026 "          </XXX>"
1027 "          <CCC>"
1028 "               <DDD/>"
1029 "          </CCC>"
1030 "     </AAA>"
1031 },
1034 "//GGG/ancestor-or-self::*",
1035 "Description",
1036 "     <AAA>"
1037 "          <BBB>"
1038 "               <CCC/>"
1039 "               <ZZZ>"
1040 "                    <DDD/>"
1041 "               </ZZZ>"
1042 "          </BBB>"
1043 "          <XXX>"
1044 "               <DDD>"
1045 "                    <EEE/>"
1046 "                    <DDD/>"
1047 "                    <CCC/>"
1048 "                    <FFF/>"
1049 "                    <FFF>"
1050 "                         <GGG/>"
1051 "                    </FFF>"
1052 "               </DDD>"
1053 "          </XXX>"
1054 "          <CCC>"
1055 "               <DDD/>"
1056 "          </CCC>"
1057 "     </AAA>"
1058 },
1061 "//GGG/ancestor::*",
1062 "Description",
1063 "     <AAA>"
1064 "          <BBB>"
1065 "               <CCC/>"
1066 "               <ZZZ/>"
1067 "          </BBB>"
1068 "          <XXX>"
1069 "               <DDD>"
1070 "                    <EEE/>"
1071 "                    <FFF>"
1072 "                         <HHH/>"
1073 "                         <GGG>"
1074 "                              <JJJ>"
1075 "                                   <QQQ/>"
1076 "                              </JJJ>"
1077 "                              <JJJ/>"
1078 "                         </GGG>"
1079 "                         <HHH/>"
1080 "                    </FFF>"
1081 "               </DDD>"
1082 "          </XXX>"
1083 "          <CCC>"
1084 "               <DDD/>"
1085 "          </CCC>"
1086 "     </AAA>"
1087 },
1090 "//GGG/descendant::*",
1091 "Description",
1092 "     <AAA>"
1093 "          <BBB>"
1094 "               <CCC/>"
1095 "               <ZZZ/>"
1096 "          </BBB>"
1097 "          <XXX>"
1098 "               <DDD>"
1099 "                    <EEE/>"
1100 "                    <FFF>"
1101 "                         <HHH/>"
1102 "                         <GGG>"
1103 "                              <JJJ>"
1104 "                                   <QQQ/>"
1105 "                              </JJJ>"
1106 "                              <JJJ/>"
1107 "                         </GGG>"
1108 "                         <HHH/>"
1109 "                    </FFF>"
1110 "               </DDD>"
1111 "          </XXX>"
1112 "          <CCC>"
1113 "               <DDD/>"
1114 "          </CCC>"
1115 "     </AAA>"
1116 },
1119 "//GGG/following::*",
1120 "Description",
1121 "     <AAA>"
1122 "          <BBB>"
1123 "               <CCC/>"
1124 "               <ZZZ/>"
1125 "          </BBB>"
1126 "          <XXX>"
1127 "               <DDD>"
1128 "                    <EEE/>"
1129 "                    <FFF>"
1130 "                         <HHH/>"
1131 "                         <GGG>"
1132 "                              <JJJ>"
1133 "                                   <QQQ/>"
1134 "                              </JJJ>"
1135 "                              <JJJ/>"
1136 "                         </GGG>"
1137 "                         <HHH/>"
1138 "                    </FFF>"
1139 "               </DDD>"
1140 "          </XXX>"
1141 "          <CCC>"
1142 "               <DDD/>"
1143 "          </CCC>"
1144 "     </AAA>"
1145 },
1148 "//GGG/preceding::*",
1149 "Description",
1150 "     <AAA>"
1151 "          <BBB>"
1152 "               <CCC/>"
1153 "               <ZZZ/>"
1154 "          </BBB>"
1155 "          <XXX>"
1156 "               <DDD>"
1157 "                    <EEE/>"
1158 "                    <FFF>"
1159 "                         <HHH/>"
1160 "                         <GGG>"
1161 "                              <JJJ>"
1162 "                                   <QQQ/>"
1163 "                              </JJJ>"
1164 "                              <JJJ/>"
1165 "                         </GGG>"
1166 "                         <HHH/>"
1167 "                    </FFF>"
1168 "               </DDD>"
1169 "          </XXX>"
1170 "          <CCC>"
1171 "               <DDD/>"
1172 "          </CCC>"
1173 "     </AAA>"
1174 },
1177 "//GGG/self::*",
1178 "Description",
1179 "     <AAA>"
1180 "          <BBB>"
1181 "               <CCC/>"
1182 "               <ZZZ/>"
1183 "          </BBB>"
1184 "          <XXX>"
1185 "               <DDD>"
1186 "                    <EEE/>"
1187 "                    <FFF>"
1188 "                         <HHH/>"
1189 "                         <GGG>"
1190 "                              <JJJ>"
1191 "                                   <QQQ/>"
1192 "                              </JJJ>"
1193 "                              <JJJ/>"
1194 "                         </GGG>"
1195 "                         <HHH/>"
1196 "                    </FFF>"
1197 "               </DDD>"
1198 "          </XXX>"
1199 "          <CCC>"
1200 "               <DDD/>"
1201 "          </CCC>"
1202 "     </AAA>"
1203 },
1206 "//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*",
1207 "description",
1208 "     <AAA>"
1209 "          <BBB>"
1210 "               <CCC/>"
1211 "               <ZZZ/>"
1212 "          </BBB>"
1213 "          <XXX>"
1214 "               <DDD>"
1215 "                    <EEE/>"
1216 "                    <FFF>"
1217 "                         <HHH/>"
1218 "                         <GGG>"
1219 "                              <JJJ>"
1220 "                                   <QQQ/>"
1221 "                              </JJJ>"
1222 "                              <JJJ/>"
1223 "                         </GGG>"
1224 "                         <HHH/>"
1225 "                    </FFF>"
1226 "               </DDD>"
1227 "          </XXX>"
1228 "          <CCC>"
1229 "               <DDD/>"
1230 "          </CCC>"
1231 "     </AAA>"
1232 },
1235 "//BBB[position() mod 2 = 0 ]",
1236 "Select even BBB elements",
1237 "     <AAA>"
1238 "          <BBB/>"
1239 "          <BBB/>"
1240 "          <BBB/>"
1241 "          <BBB/>"
1242 "          <BBB/>"
1243 "          <BBB/>"
1244 "          <BBB/>"
1245 "          <BBB/>"
1246 "          <CCC/>"
1247 "          <CCC/>"
1248 "          <CCC/>"
1249 "     </AAA>"
1250 },
1253 "//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
1254 "Select middle BBB element(s)",
1255 "     <AAA>"
1256 "          <BBB/>"
1257 "          <BBB/>"
1258 "          <BBB/>"
1259 "          <BBB/>"
1260 "          <BBB/>"
1261 "          <BBB/>"
1262 "          <BBB/>"
1263 "          <BBB/>"
1264 "          <CCC/>"
1265 "          <CCC/>"
1266 "          <CCC/>"
1267 "     </AAA>"
1268 },
1271 "//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
1272 "Select middle CCC element(s)",
1273 "     <AAA>"
1274 "          <BBB/>"
1275 "          <BBB/>"
1276 "          <BBB/>"
1277 "          <BBB/>"
1278 "          <BBB/>"
1279 "          <BBB/>"
1280 "          <BBB/>"
1281 "          <BBB/>"
1282 "          <CCC/>"
1283 "          <CCC/>"
1284 "          <CCC/>"
1285 "     </AAA>"
1288 }; //end