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