f34c62c80958b1bad94031498152eb17a0bc9dbf
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 },
106 {
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 },
125 {
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 },
155 {
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 },
185 {
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 },
215 {
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 },
226 {
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 },
237 {
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 },
248 {
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 },
259 {
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 },
270 {
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 },
281 {
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 },
292 {
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 },
302 {
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 },
312 {
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 },
322 {
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 },
342 {
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 },
362 {
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 },
382 {
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 },
402 {
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 },
422 {
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 },
442 {
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 },
455 {
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 },
468 {
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 },
481 {
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 },
494 {
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 },
507 {
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 },
520 {
521 "/AAA",
522 "Equivalent of /child::AAA",
523 " <AAA>"
524 " <BBB/>"
525 " <CCC/>"
526 " </AAA>"
527 },
529 {
530 "/child::AAA",
531 "Equivalent of /AAA",
532 " <AAA>"
533 " <BBB/>"
534 " <CCC/>"
535 " </AAA>"
536 },
538 {
539 "/AAA/BBB",
540 "Equivalent of /child::AAA/child::BBB",
541 " <AAA>"
542 " <BBB/>"
543 " <CCC/>"
544 " </AAA>"
545 },
547 {
548 "/child::AAA/child::BBB",
549 "Equivalent of /AAA/BBB",
550 " <AAA>"
551 " <BBB/>"
552 " <CCC/>"
553 " </AAA>"
554 },
556 {
557 "/child::AAA/BBB",
558 "Both possibilities can be combined",
559 " <AAA>"
560 " <BBB/>"
561 " <CCC/>"
562 " </AAA>"
563 },
565 {
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 },
589 {
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 },
613 {
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 },
637 {
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 },
661 {
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 },
685 {
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 },
709 {
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 },
733 {
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 },
758 {
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 },
783 {
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 },
808 {
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 },
832 {
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 },
865 {
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 },
898 {
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 },
925 {
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 },
952 {
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 },
979 {
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 },
1006 {
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 },
1033 {
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 },
1060 {
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 },
1089 {
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 },
1118 {
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 },
1147 {
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 },
1176 {
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 },
1205 {
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 },
1234 {
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 },
1252 {
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 },
1270 {
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>"
1286 }
1288 }; //end