1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
#ifndef PUGIXML_NO_XPATH
#include "common.hpp"
TEST_XML(xpath_paths_axes_child, "<node attr='value'><child attr='value'><subchild/></child><another/><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "child:: node()");
CHECK_XPATH_NODESET(n, "child:: node()") % 4 % 7 % 8;
CHECK_XPATH_NODESET(n, "another/child:: node()");
}
TEST_XML(xpath_paths_axes_descendant, "<node attr='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "descendant:: node()");
CHECK_XPATH_NODESET(n, "descendant:: node()") % 4 % 6 % 7 % 8 % 9;
CHECK_XPATH_NODESET(doc, "descendant:: node()") % 2 % 4 % 6 % 7 % 8 % 9;
CHECK_XPATH_NODESET(n, "another/descendant:: node()") % 8;
CHECK_XPATH_NODESET(n, "last/descendant:: node()");
}
TEST_XML(xpath_paths_axes_parent, "<node attr='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "parent:: node()");
CHECK_XPATH_NODESET(n.child("child"), "parent:: node()") % 2;
CHECK_XPATH_NODESET(n, "child/subchild/parent:: node()") % 4;
CHECK_XPATH_NODESET(n, "@attr/parent:: node()") % 2;
CHECK_XPATH_NODESET(n, "parent:: node()") % 1;
CHECK_XPATH_NODESET(doc, "parent:: node()");
}
TEST_XML(xpath_paths_axes_ancestor, "<node attr='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "ancestor:: node()");
CHECK_XPATH_NODESET(n.child("child"), "ancestor:: node()") % 2 % 1;
CHECK_XPATH_NODESET(n, "child/subchild/ancestor:: node()") % 4 % 2 % 1;
CHECK_XPATH_NODESET(n, "child/@attr/ancestor:: node()") % 4 % 2 % 1;
CHECK_XPATH_NODESET(n, "ancestor:: node()") % 1;
CHECK_XPATH_NODESET(doc, "ancestor:: node()");
}
TEST_XML(xpath_paths_axes_following_sibling, "<node attr1='value' attr2='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "following-sibling:: node()");
CHECK_XPATH_NODESET(n.child("child"), "following-sibling:: node()") % 8 % 10;
CHECK_XPATH_NODESET(n.child("last"), "following-sibling:: node()");
CHECK_XPATH_NODESET(n, "@attr1/following-sibling:: node()");
}
TEST_XML(xpath_paths_axes_preceding_sibling, "<node attr1='value' attr2='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "preceding-sibling:: node()");
CHECK_XPATH_NODESET(n.child("child"), "preceding-sibling:: node()");
CHECK_XPATH_NODESET(n.child("last"), "preceding-sibling:: node()") % 8 % 5;
CHECK_XPATH_NODESET(n, "@attr2/following-sibling:: node()");
}
TEST_XML(xpath_paths_axes_following, "<node attr1='value' attr2='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "following:: node()");
CHECK_XPATH_NODESET(n, "following:: node()");
CHECK_XPATH_NODESET(n.child("child"), "following:: node()") % 8 % 9 % 10;
CHECK_XPATH_NODESET(n.child("child").child("subchild"), "following:: node()") % 8 % 9 % 10;
CHECK_XPATH_NODESET(n.child("last"), "following:: node()");
}
TEST_XML(xpath_paths_axes_preceding, "<node attr1='value' attr2='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "preceding:: node()");
CHECK_XPATH_NODESET(n.child("child"), "preceding:: node()");
CHECK_XPATH_NODESET(n.child("last"), "preceding:: node()") % 9 % 8 % 7 % 5;
CHECK_XPATH_NODESET(n.child("another").child("subchild"), "preceding:: node()") % 7 % 5;
CHECK_XPATH_NODESET(n, "preceding:: node()");
}
TEST_XML(xpath_paths_axes_attribute, "<node attr1='value' attr2='value'><child attr='value'><subchild/></child><another xmlns:foo='bar'><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "attribute:: node()");
CHECK_XPATH_NODESET(n.child("child"), "attribute:: node()") % 6;
CHECK_XPATH_NODESET(n.child("last"), "attribute:: node()");
CHECK_XPATH_NODESET(n, "attribute:: node()") % 3 % 4;
CHECK_XPATH_NODESET(doc, "descendant-or-self:: node()/attribute:: node()") % 3 % 4 % 6;
CHECK_XPATH_NODESET(n.child("another"), "attribute:: node()");
}
TEST_XML(xpath_paths_axes_namespace, "<node xmlns:foo='bar'/>")
{
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(n, "namespace:: node()");
}
TEST_XML(xpath_paths_axes_self, "<node attr='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "self:: node()");
CHECK_XPATH_NODESET(n.child("child"), "self:: node()") % 4;
CHECK_XPATH_NODESET(n, "self:: node()") % 2;
CHECK_XPATH_NODESET(n, "child/@attr/self:: node()") % 5;
CHECK_XPATH_NODESET(doc, "self:: node()") % 1;
}
TEST_XML(xpath_paths_axes_descendant_or_self, "<node attr='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "descendant-or-self:: node()");
CHECK_XPATH_NODESET(n, "descendant-or-self:: node()") % 2 % 4 % 6 % 7 % 8 % 9;
CHECK_XPATH_NODESET(doc, "descendant-or-self:: node()") % 1 % 2 % 4 % 6 % 7 % 8 % 9;
CHECK_XPATH_NODESET(n, "another/descendant-or-self:: node()") % 7 % 8;
CHECK_XPATH_NODESET(n, "last/descendant-or-self:: node()") % 9;
}
TEST_XML(xpath_paths_axes_ancestor_or_self, "<node attr='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
xml_node c;
xml_node n = doc.child("node");
CHECK_XPATH_NODESET(c, "ancestor-or-self:: node()");
CHECK_XPATH_NODESET(n.child("child"), "ancestor-or-self:: node()") % 4 % 2 % 1;
CHECK_XPATH_NODESET(n, "child/subchild/ancestor-or-self:: node()") % 6 % 4 % 2 % 1;
CHECK_XPATH_NODESET(n, "child/@attr/ancestor-or-self:: node()") % 5 % 4 % 2 % 1;
CHECK_XPATH_NODESET(n, "ancestor-or-self:: node()") % 2 % 1;
CHECK_XPATH_NODESET(doc, "ancestor-or-self:: node()") % 1;
}
#endif
|