1 Package com.interrupt.cc.xpath;
\r
4 author: Timothy Washington
\r
5 email twashing [at] gmail.com
\r
8 Copyright (c) 2008, Tim Washington
\r
11 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
\r
13 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
\r
14 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
\r
15 * Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
\r
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
21 declare namespace xq='http://xmlbeans.apache.org/samples/xquery/employees';
\r
22 $this/xq:employees/xq:employee/xq:phone[contains(., '(206)')]
\r
24 ./child::node()[1]/attribute::name
\r
25 *) Find value of the name attribute of the first element in the XMl document
\r
26 1) The first section is only a dot (.). A dot at the start of a query means you want to start your search from the beginning of the XMl document.
\r
27 2) The second section (child::node()[1]) says: Find the first child element node. The combined effect of the first and second portions (./child::node()[1]) is like saying: Find the first element of this XMl document.
\r
28 3) The third section (attribute::name) says: Find the value of an attribute name. The combined effect of the query is like saying: .
\r
30 ./child::node()[1]/child::service/child::port/child::soap:address/attribute::location
\r
31 *) Find the first child node of the XMl document, then find a service child element within the first child, then find a port element inside the service element, then look inside the port element for an address element that belongs to the sOAP namespace and return the value of its location attribute.
\r
36 --> Expression tests
\r
37 //system/bookkeeping
\r
45 attribute::attribute()
\r
47 /descendant-or-self::element()
\r
48 //following-sibling::node()
\r
49 following::element()
\r
56 preceding-sibling::node()
\r
58 ancestor-or-self::node()
\r
62 ./child::node()[ @asdf='' ]
\r
63 ./child::node()/child::service/child::port/child::soap:address/attribute::location
\r
64 ./child::node()[]/child::service/child::port/child::soap:address/attribute::location
\r
65 ./child::node()[ @name='tim' ]
\r
66 ./child::node()[ 1 ]
\r
67 ./child::node()[ 12 ]
\r
68 ./child::node()[ 1 ]/child::service/child::port/child::soap:address/attribute::location
\r
69 /GPS/memory[text()=""]
\r
70 /GPS/memory[text()="64MB"]
\r
74 [x] for $i in (10, 20), $j in (1, 2)
\r
75 return ( $i + $j ) Error: [1,6] expecting: letter, '_'
\r
76 [x] for $x in $z, $y in f($x)
\r
77 return g($x, $y) Error: [1,6] expecting: letter, '_'
\r
78 [x] for $a in fn:distinct-values(book/author)
\r
79 return (book/author[. = $a][1], book[author = $a]/title)
\r
82 --> if / then / else
\r
83 [x] if ($widget1/unit-cost < $widget2/unit-cost)
\r
85 else $widget2 Error: [1,18] expecting: ',', ')'
\r
87 if ($x castable as hatsize)
\r
88 then $x cast as hatsize
\r
94 1 eq 2 and 3 idiv 0 = 1
\r
95 1 eq 1 or 3 idiv 0 = 1
\r
98 --> cast / castable
\r
99 [x] if ($x castable as hatsize)
\r
100 then $x cast as hatsize Error: [1,6] expecting: letter, '_'
\r
104 every $part in /parts/part satisfies $part/@discounted
\r
105 [x] every $xart in (1, 2, 3), $yart in (2, 3, 4)
\r
106 satisfies $xart + $yart = 4
\r
107 [x] some $xart in (1, 2, "cat") satisfies $x * 2 = 4 Error: [1,7] expecting: letter, '_'
\r
110 --> intersect / except
\r
111 $seq1 intersect $seq2
\r
116 [x] $p instance of xs:decimal Error: [1,2] expecting: letter, '_'
\r
117 5 instance of xs:integer
\r
118 (5, 6) instance of xs:integer+
\r
122 $myaddress treat as element(*, USAddress)
\r
130 * - with defining differences (ex: ncname)
\r
136 basechar = [0x0041..0x005A] | [0x0061..0x007A] | [0x00C0..0x00D6] |
\r
137 [0x00D8..0x00F6] | [0x00F8..0x00FF] | [0x0100..0x0131] |
\r
138 [0x0134..0x013E] | [0x0141..0x0148] | [0x014A..0x017E] |
\r
139 [0x0180..0x01C3] | [0x01CD..0x01F0] | [0x01F4..0x01F5] |
\r
140 [0x01FA..0x0217] | [0x0250..0x02A8] | [0x02BB..0x02C1] |
\r
141 0x0386 | [0x0388..0x038A] | 0x038C | [0x038E..0x03A1] |
\r
142 [0x03A3..0x03CE] | [0x03D0..0x03D6] | 0x03DA | 0x03DC |
\r
143 0x03DE | 0x03E0 | [0x03E2..0x03F3] | [0x0401..0x040C] |
\r
144 [0x040E..0x044F] | [0x0451..0x045C] | [0x045E..0x0481] |
\r
145 [0x0490..0x04C4] | [0x04C7..0x04C8] | [0x04CB..0x04CC] |
\r
146 [0x04D0..0x04EB] | [0x04EE..0x04F5] | [0x04F8..0x04F9] |
\r
147 [0x0531..0x0556] | 0x0559 | [0x0561..0x0586] | [0x05D0..0x05EA] |
\r
148 [0x05F0..0x05F2] | [0x0621..0x063A] | [0x0641..0x064A] |
\r
149 [0x0671..0x06B7] | [0x06BA..0x06BE] | [0x06C0..0x06CE] |
\r
150 [0x06D0..0x06D3] | 0x06D5 | [0x06E5..0x06E6] | [0x0905..0x0939] |
\r
151 0x093D | [0x0958..0x0961] | [0x0985..0x098C] | [0x098F..0x0990] |
\r
152 [0x0993..0x09A8] | [0x09AA..0x09B0] | 0x09B2 | [0x09B6..0x09B9] |
\r
153 [0x09DC..0x09DD] | [0x09DF..0x09E1] | [0x09F0..0x09F1] |
\r
154 [0x0A05..0x0A0A] | [0x0A0F..0x0A10] | [0x0A13..0x0A28] |
\r
155 [0x0A2A..0x0A30] | [0x0A32..0x0A33] | [0x0A35..0x0A36] |
\r
156 [0x0A38..0x0A39] | [0x0A59..0x0A5C] | 0x0A5E | [0x0A72..0x0A74] |
\r
157 [0x0A85..0x0A8B] | 0x0A8D | [0x0A8F..0x0A91] | [0x0A93..0x0AA8] |
\r
158 [0x0AAA..0x0AB0] | [0x0AB2..0x0AB3] | [0x0AB5..0x0AB9] |
\r
159 0x0ABD | 0x0AE0 | [0x0B05..0x0B0C] | [0x0B0F..0x0B10] |
\r
160 [0x0B13..0x0B28] | [0x0B2A..0x0B30] | [0x0B32..0x0B33] |
\r
161 [0x0B36..0x0B39] | 0x0B3D | [0x0B5C..0x0B5D] | [0x0B5F..0x0B61] |
\r
162 [0x0B85..0x0B8A] | [0x0B8E..0x0B90] | [0x0B92..0x0B95] |
\r
163 [0x0B99..0x0B9A] | 0x0B9C | [0x0B9E..0x0B9F] | [0x0BA3..0x0BA4] |
\r
164 [0x0BA8..0x0BAA] | [0x0BAE..0x0BB5] | [0x0BB7..0x0BB9] |
\r
165 [0x0C05..0x0C0C] | [0x0C0E..0x0C10] | [0x0C12..0x0C28] |
\r
166 [0x0C2A..0x0C33] | [0x0C35..0x0C39] | [0x0C60..0x0C61] |
\r
167 [0x0C85..0x0C8C] | [0x0C8E..0x0C90] | [0x0C92..0x0CA8] |
\r
168 [0x0CAA..0x0CB3] | [0x0CB5..0x0CB9] | 0x0CDE | [0x0CE0..0x0CE1] |
\r
169 [0x0D05..0x0D0C] | [0x0D0E..0x0D10] | [0x0D12..0x0D28] |
\r
170 [0x0D2A..0x0D39] | [0x0D60..0x0D61] | [0x0E01..0x0E2E] | 0x0E30 |
\r
171 [0x0E32..0x0E33] | [0x0E40..0x0E45] | [0x0E81..0x0E82] | 0x0E84 |
\r
172 [0x0E87..0x0E88] | 0x0E8A | 0x0E8D | [0x0E94..0x0E97] |
\r
173 [0x0E99..0x0E9F] | [0x0EA1..0x0EA3] | 0x0EA5 | 0x0EA7 |
\r
174 [0x0EAA..0x0EAB] | [0x0EAD..0x0EAE] | 0x0EB0 | [0x0EB2..0x0EB3] |
\r
175 0x0EBD | [0x0EC0..0x0EC4] | [0x0F40..0x0F47] | [0x0F49..0x0F69] |
\r
176 [0x10A0..0x10C5] | [0x10D0..0x10F6] | 0x1100 | [0x1102..0x1103] |
\r
177 [0x1105..0x1107] | 0x1109 | [0x110B..0x110C] | [0x110E..0x1112] |
\r
178 0x113C | 0x113E | 0x1140 | 0x114C | 0x114E | 0x1150 |
\r
179 [0x1154..0x1155] | 0x1159 | [0x115F..0x1161] | 0x1163 |
\r
180 0x1165 | 0x1167 | 0x1169 | [0x116D..0x116E] | [0x1172..0x1173] |
\r
181 0x1175 | 0x119E | 0x11A8 | 0x11AB | [0x11AE..0x11AF] |
\r
182 [0x11B7..0x11B8] | 0x11BA | [0x11BC..0x11C2] | 0x11EB |
\r
183 0x11F0 | 0x11F9 | [0x1E00..0x1E9B] | [0x1EA0..0x1EF9] |
\r
184 [0x1F00..0x1F15] | [0x1F18..0x1F1D] | [0x1F20..0x1F45] |
\r
185 [0x1F48..0x1F4D] | [0x1F50..0x1F57] | 0x1F59 | 0x1F5B |
\r
186 0x1F5D | [0x1F5F..0x1F7D] | [0x1F80..0x1FB4] | [0x1FB6..0x1FBC] |
\r
187 0x1FBE | [0x1FC2..0x1FC4] | [0x1FC6..0x1FCC] | [0x1FD0..0x1FD3] |
\r
188 [0x1FD6..0x1FDB] | [0x1FE0..0x1FEC] | [0x1FF2..0x1FF4] |
\r
189 [0x1FF6..0x1FFC] | 0x2126 | [0x212A..0x212B] | 0x212E |
\r
190 [0x2180..0x2182] | [0x3041..0x3094] | [0x30A1..0x30FA] |
\r
191 [0x3105..0x312C] | [0xAC00..0xD7A3];
\r
193 ideographic = [0x4E00..0x9FA5] | 0x3007 | [0x3021..0x3029];
\r
196 combiningchar = [0x0300..0x0345] | [0x0360..0x0361] | [0x0483..0x0486] |
\r
197 [0x0591..0x05A1] | [0x05A3..0x05B9] | [0x05BB..0x05BD] |
\r
198 0x05BF | [0x05C1..0x05C2] | 0x05C4 | [0x064B..0x0652] |
\r
199 0x0670 | [0x06D6..0x06DC] | [0x06DD..0x06DF] | [0x06E0..0x06E4] |
\r
200 [0x06E7..0x06E8] | [0x06EA..0x06ED] | [0x0901..0x0903] |
\r
201 0x093C | [0x093E..0x094C] | 0x094D | [0x0951..0x0954] |
\r
202 [0x0962..0x0963] | [0x0981..0x0983] | 0x09BC | 0x09BE |
\r
203 0x09BF | [0x09C0..0x09C4] | [0x09C7..0x09C8] | [0x09CB..0x09CD] |
\r
204 0x09D7 | [0x09E2..0x09E3] | 0x0A02 | 0x0A3C | 0x0A3E |
\r
205 0x0A3F | [0x0A40..0x0A42] | [0x0A47..0x0A48] | [0x0A4B..0x0A4D] |
\r
206 [0x0A70..0x0A71] | [0x0A81..0x0A83] | 0x0ABC | [0x0ABE..0x0AC5] |
\r
207 [0x0AC7..0x0AC9] | [0x0ACB..0x0ACD] | [0x0B01..0x0B03] |
\r
208 0x0B3C | [0x0B3E..0x0B43] | [0x0B47..0x0B48] | [0x0B4B..0x0B4D] |
\r
209 [0x0B56..0x0B57] | [0x0B82..0x0B83] | [0x0BBE..0x0BC2] |
\r
210 [0x0BC6..0x0BC8] | [0x0BCA..0x0BCD] | 0x0BD7 | [0x0C01..0x0C03] |
\r
211 [0x0C3E..0x0C44] | [0x0C46..0x0C48] | [0x0C4A..0x0C4D] |
\r
212 [0x0C55..0x0C56] | [0x0C82..0x0C83] | [0x0CBE..0x0CC4] |
\r
213 [0x0CC6..0x0CC8] | [0x0CCA..0x0CCD] | [0x0CD5..0x0CD6] |
\r
214 [0x0D02..0x0D03] | [0x0D3E..0x0D43] | [0x0D46..0x0D48] |
\r
215 [0x0D4A..0x0D4D] | 0x0D57 | 0x0E31 | [0x0E34..0x0E3A] |
\r
216 [0x0E47..0x0E4E] | 0x0EB1 | [0x0EB4..0x0EB9] | [0x0EBB..0x0EBC] |
\r
217 [0x0EC8..0x0ECD] | [0x0F18..0x0F19] | 0x0F35 | 0x0F37 |
\r
218 0x0F39 | 0x0F3E | 0x0F3F | [0x0F71..0x0F84] | [0x0F86..0x0F8B] |
\r
219 [0x0F90..0x0F95] | 0x0F97 | [0x0F99..0x0FAD] | [0x0FB1..0x0FB7] |
\r
220 0x0FB9 | [0x20D0..0x20DC] | 0x20E1 | [0x302A..0x302F] |
\r
223 digit = [ '0' .. '9' ];
\r
225 extender = 0x00B7 | 0x02D0 | 0x02D1 | 0x0387 | 0x0640 | 0x0E46 |
\r
226 0x0EC6 | 0x3005 | [0x3031..0x3035] | [0x309D..0x309E] |
\r
231 * XML names and characters taken (for reference) from these sources
\r
233 * http://www.w3.org/TR/REC-xml-names/#NT-QName
\r
234 * http://www.w3.org/TR/REC-xml-names/#NT-NCName
\r
235 * http://www.w3.org/TR/REC-xml/#NT-NameChar
\r
236 * http://www.w3.org/TR/REC-xml/#NT-Letter
\r
239 letter_helper = basechar |
\r
242 //namechar = letter_helper | digit | '.' | '-' | '_' | ':' | combiningchar | extender;
\r
243 namechar = letter_helper | '.' | '-' | '_' | ':' | combiningchar | extender;
\r
244 name = (letter_helper | '_' | ':') (namechar)*;
\r
245 names = name (0x20 name)*;
\r
246 nmtoken = (namechar)+;
\r
247 nmtokens = nmtoken (0x20 nmtoken)*;
\r
248 char = 0x9 | 0xA | 0xD | [0x20-0xD7FF] | [0xE000-0xFFFD] | [0x10000-0x10FFFF];
\r
251 escapequot = '""';
\r
253 doubleliteral_helper = (('.' digit) |
\r
254 (digit ('.' [0-9]*)?)) ('e' | 'E') ('+' | '-')? digit;
\r
255 stringliteral_helper = ( 0x22 (namechar)* 0x22 ) | (''' (namechar)* ''');
\r
261 eol = cr lf | cr | lf; // This takes care of different platforms
\r
266 keyword_return = 'return';
\r
267 keyword_for = 'for';
\r
270 keyword_is = 'is';
\r
271 keyword_satisfies = 'satisfies';
\r
272 keyword_then = 'then';
\r
273 keyword_else = 'else';
\r
275 keyword_and = 'and';
\r
276 keyword_to = 'to';
\r
277 keyword_div = 'div';
\r
278 keyword_idiv = 'idiv';
\r
279 keyword_mod = 'mod';
\r
280 keyword_union = 'union';
\r
281 keyword_intersect = 'intersect';
\r
282 keyword_except = 'except';
\r
283 keyword_instance = 'instance';
\r
285 keyword_treat = 'treat';
\r
287 keyword_castable = 'castable';
\r
288 keyword_cast = 'cast';
\r
289 keyword_some = 'some';
\r
290 keyword_every = 'every';
\r
321 ncomp_precedes = '<<';
\r
322 ncomp_follows = '>>';
\r
327 abbrev_root_desc = '//';
\r
328 abbrev_attrib = '@';
\r
329 abbrev_reversestep = '..';
\r
330 abbrev_context = '.';
\r
338 axis_child = 'child';
\r
339 axis_descendant = 'descendant';
\r
340 axis_attribute = 'attribute';
\r
341 axis_self = 'self';
\r
342 axis_descendant_or_self = 'descendant-or-self';
\r
343 axis_following_sibling = 'following-sibling';
\r
344 axis_following = 'following';
\r
345 axis_namespace = 'namespace';
\r
348 axis_parent = 'parent';
\r
349 axis_ancestor = 'ancestor';
\r
350 axis_preceding_sibling = 'preceding-sibling';
\r
351 axis_preceding = 'preceding';
\r
352 axis_ancestor_or_self = 'ancestor-or-self';
\r
356 * Node Set Functions
\r
358 * function: number last()
\r
359 * function: number position()
\r
360 * function: number count(node-set)
\r
361 * function: node-set id(object)
\r
362 * function: string local-name(node-set?)
\r
363 * function: string namespace-uri(node-set?)
\r
364 * function: string name(node-set?)
\r
370 * function: string string(object?)
\r
371 * function: string concat(string, string, string*)
\r
372 * function: boolean starts-with(string, string)
\r
373 * function: boolean contains(string, string)
\r
374 * function: string substring-before(string, string)
\r
375 * function: string substring-after(string, string)
\r
376 * function: string substring(string, number, number?)
\r
377 * function: number string-length(string?)
\r
378 * function: string normalize-space(string?)
\r
379 * function: string translate(string, string, string)
\r
383 * Boolean Functions
\r
385 * function: boolean boolean(object)
\r
386 * function: boolean not(boolean)
\r
387 * function: boolean true()
\r
388 * function: boolean false()
\r
389 * function: boolean lang(string)
\r
395 * function: number number(object?)
\r
396 * function: number sum(node-set)
\r
397 * function: number floor(number)
\r
398 * function: number ceiling(number)
\r
399 * function: number round(number)
\r
403 * Reserved Function Names
\r
405 //fn_attribute = 'attribute';
\r
406 fn_comment = 'comment';
\r
407 fn_document_node = 'document-node';
\r
408 fn_element = 'element';
\r
409 fn_empty_sequence = 'empty-sequence';
\r
412 fn_processing_instruction = 'processing-instruction';
\r
413 fn_schema_attribute = 'schema-attribute';
\r
414 fn_schema_element = 'schema-element';
\r
416 fn_typeswitch = 'typeswitch';
\r
421 letter = basechar+;
\r
423 ncnamechar = namechar;
\r
424 //ncnamechar = [namechar - ':'];
\r
428 integerliteral = digit+;
\r
430 decimalliteral = ('.' digit+) | (digit+ '.' digit*);
\r
432 doubleliteral = doubleliteral_helper;
\r
434 stringliteral = stringliteral_helper;
\r
436 whitespace = (' ' | tab | eol);
\r
437 comment = '(:' (char)* ':)';
\r
450 expr = exprsingle? expr_part*;
\r
451 expr_part = T.comma exprsingle;
\r
453 exprsingle = {for} forexpr |
\r
454 {quantif} quantifiedexpr |
\r
458 forexpr = simpleforclause T.keyword_return exprsingle;
\r
460 simpleforclause = T.keyword_for T.dollar varname T.keyword_in exprsingle simpleforclause_part*;
\r
461 simpleforclause_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
463 quantifiedexpr = some_every_part T.dollar varname T.keyword_in [exprsingle1]:exprsingle quantifiedexpr_part* T.keyword_satisfies [exprsingle2]:exprsingle;
\r
464 some_every_part = {some} T.keyword_some |
\r
465 {every} T.keyword_every;
\r
466 quantifiedexpr_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
468 ifexpr = T.keyword_if T.lparenth expr T.rparenth T.keyword_then [exprsingle1]:exprsingle T.keyword_else [exprsingle2]:exprsingle;
\r
470 orexpr = andexpr orexpr_part*;
\r
471 orexpr_part = T.keyword_or andexpr;
\r
473 andexpr = comparisonexpr andexpr_part*;
\r
474 andexpr_part = T.keyword_and comparisonexpr;
\r
476 comparisonexpr = rangeexpr comparisonexpr_part?;
\r
477 comparisonexpr_part = comparisonexpr_part_part rangeexpr;
\r
478 comparisonexpr_part_part = {value} valuecomp |
\r
479 {general} generalcomp |
\r
482 rangeexpr = additiveexpr rangeexpr_part?;
\r
483 rangeexpr_part = T.keyword_to additiveexpr;
\r
485 additiveexpr = multiplicativeexpr additiveexpr_part*;
\r
486 additiveexpr_part = additiveexpr_part_part multiplicativeexpr;
\r
487 additiveexpr_part_part = {plus} T.plus2 |
\r
491 multiplicativeexpr = unionexpr multiplicativeexpr_part*;
\r
492 multiplicativeexpr_part = multiplicativeexpr_part_part unionexpr;
\r
493 multiplicativeexpr_part_part = {star} T.star2 |
\r
494 {div} T.keyword_div |
\r
495 {idiv} T.keyword_idiv |
\r
496 {mod} T.keyword_mod;
\r
498 unionexpr = intersectexceptexpr unionexpr_part*;
\r
499 unionexpr_part = unionexpr_part_part intersectexceptexpr;
\r
500 unionexpr_part_part = {unionkey} T.keyword_union |
\r
503 intersectexceptexpr = instanceofexpr intersectexceptexpr_part*;
\r
504 intersectexceptexpr_part = intersectexceptexpr_part_part instanceofexpr;
\r
505 intersectexceptexpr_part_part = {intersect} T.keyword_intersect |
\r
506 {except} T.keyword_except;
\r
508 instanceofexpr = treatexpr instanceofexpr_part?;
\r
509 instanceofexpr_part = T.keyword_instance T.keyword_of sequencetype;
\r
511 treatexpr = castableexpr treatexpr_part?;
\r
512 treatexpr_part = T.keyword_treat T.keyword_as sequencetype;
\r
514 castableexpr = castexpr castableexpr_part?;
\r
515 castableexpr_part = T.keyword_castable T.keyword_as singletype;
\r
517 castexpr = unaryexpr castexpr_part?;
\r
518 castexpr_part = T.keyword_cast T.keyword_as singletype;
\r
520 unaryexpr = unaryexpr_part* valueexpr;
\r
521 unaryexpr_part = {minus} T.minus |
\r
524 valueexpr = pathexpr;
\r
526 generalcomp = {eq} T.equals |
\r
527 {ne} T.ne_abbrev |
\r
528 {lt} T.lt_abbrev |
\r
529 {le} T.le_abbrev |
\r
530 {gt} T.gt_abbrev |
\r
533 valuecomp = {eq} T.eq |
\r
540 nodecomp = {is} T.keyword_is |
\r
541 {ncomppre} T.ncomp_precedes |
\r
542 {ncompfol} T.ncomp_follows;
\r
544 pathexpr = {path1} pathexpr_part_one |
\r
545 {path2} pathexpr_part_two |
\r
546 {relpath} relativepathexpr;
\r
547 pathexpr_part_one = T.abbrev_root relativepathexpr?;
\r
548 pathexpr_part_two = T.abbrev_root_desc relativepathexpr;
\r
550 relativepathexpr = stepexpr relativepathexpr_part*;
\r
551 relativepathexpr_part = relativepathexpr_part_part stepexpr;
\r
552 relativepathexpr_part_part = {root} T.abbrev_root |
\r
553 {rootdesc} T.abbrev_root_desc;
\r
555 stepexpr = {filter} filterexpr |
\r
562 axisstep = axisstep_part predicatelist;
\r
563 axisstep_part = {reverse} reversestep |
\r
564 {forward} forwardstep;
\r
566 forwardstep = {forward} forwardstep_part |
\r
567 {abbrevforward} abbrevforwardstep;
\r
568 forwardstep_part = forwardaxis nodetest;
\r
570 forwardaxis = {forward1} forwardaxis_part_one |
\r
571 {forward2} forwardaxis_part_two |
\r
572 {forward3} forwardaxis_part_three |
\r
573 {forward4} forwardaxis_part_four |
\r
574 {forward5} forwardaxis_part_five |
\r
575 {forward6} forwardaxis_part_six |
\r
576 {forward7} forwardaxis_part_seven |
\r
577 {forward8} forwardaxis_part_eight;
\r
578 forwardaxis_part_one = T.axis_child T.axis_delim;
\r
579 forwardaxis_part_two = T.axis_descendant T.axis_delim;
\r
580 forwardaxis_part_three = T.axis_attribute T.axis_delim;
\r
581 forwardaxis_part_four = T.axis_self T.axis_delim;
\r
582 forwardaxis_part_five = T.axis_descendant_or_self T.axis_delim;
\r
583 forwardaxis_part_six = T.axis_following_sibling T.axis_delim;
\r
584 forwardaxis_part_seven = T.axis_following T.axis_delim;
\r
585 forwardaxis_part_eight = T.axis_namespace T.axis_delim;
\r
587 abbrevforwardstep = T.abbrev_attrib? nodetest;
\r
589 reversestep = {reverse} reversestep_part |
\r
590 {abbrevreverse} abbrevreversestep;
\r
591 reversestep_part = reverseaxis nodetest;
\r
593 reverseaxis = {reverse1} reverseaxis_part_one |
\r
594 {reverse2} reverseaxis_part_two |
\r
595 {reverse3} reverseaxis_part_three |
\r
596 {reverse4} reverseaxis_part_four |
\r
597 {reverse5} reverseaxis_part_five;
\r
598 reverseaxis_part_one = T.axis_parent T.axis_delim;
\r
599 reverseaxis_part_two = T.axis_ancestor T.axis_delim;
\r
600 reverseaxis_part_three = T.axis_preceding_sibling T.axis_delim;
\r
601 reverseaxis_part_four = T.axis_preceding T.axis_delim;
\r
602 reverseaxis_part_five = T.axis_ancestor_or_self T.axis_delim;
\r
605 abbrevreversestep = T.abbrev_reversestep;
\r
607 nodetest = {kind} kindtest |
\r
610 nametest = {qname} qname |
\r
613 wildcard = {star} T.star |
\r
614 {wild1} wildcard_part_one |
\r
615 {wild2} wildcard_part_two;
\r
616 wildcard_part_one = ncname T.colon T.star;
\r
617 wildcard_part_two = T.star T.colon ncname;
\r
619 filterexpr = primaryexpr predicatelist;
\r
621 predicatelist = predicate*;
\r
623 predicate = T.lbracket expr T.rbracket;
\r
625 primaryexpr = {literal} literal |
\r
627 {parenthex} parenthesizedexpr |
\r
628 {contextex} contextitemexpr |
\r
629 {function} functioncall;
\r
631 literal = {numeric} numericliteral |
\r
632 {string} stringliteral;
\r
634 numericliteral = {integer} integerliteral |
\r
635 {decimal} decimalliteral |
\r
636 {double} doubleliteral;
\r
638 varref = T.dollar varname;
\r
642 parenthesizedexpr = T.lparenth expr? T.rparenth;
\r
644 contextitemexpr = T.abbrev_context;
\r
651 functioncall = qname T.lparenth functioncall_part? T.rparenth;
\r
652 functioncall_part = exprsingle functioncall_part_part*;
\r
653 functioncall_part_part = T.comma exprsingle;
\r
656 singletype = atomictype T.question?;
\r
658 sequencetype = {sequencetype1} sequencetype_part_one |
\r
659 {sequencetype2} sequencetype_part_two;
\r
660 sequencetype_part_one = T.fn_empty_sequence T.lparenth T.rparenth;
\r
661 sequencetype_part_two = itemtype occurrenceindicator?;
\r
663 occurrenceindicator = {question} T.question |
\r
668 itemtype = {kind} kindtest |
\r
669 {item} itemtype_part |
\r
670 {atomic} atomictype;
\r
671 itemtype_part = T.fn_item T.lparenth T.rparenth;
\r
673 atomictype = qname;
\r
675 kindtest = {document} documenttest |
\r
676 {element} elementtest |
\r
677 {attribute} attributetest |
\r
678 {schemaelem} schemaelementtest |
\r
679 {schemaattr} schemaattributetest |
\r
681 {comment} commenttest |
\r
683 // {any} anykindtest;
\r
686 //anykindtest = T.fn_node T.lparenth T.rparenth;
\r
687 akindtest = T.fn_node T.lparenth T.rparenth;
\r
689 documenttest = T.fn_document_node T.lparenth documenttest_part? T.rparenth;
\r
690 documenttest_part = {element} elementtest |
\r
691 {schemaelem} schemaelementtest;
\r
694 texttest = T.fn_text T.lparenth T.rparenth;
\r
696 commenttest = T.fn_comment T.lparenth T.rparenth;
\r
698 pitest = T.fn_processing_instruction T.lparenth pitest_part? T.rparenth;
\r
699 pitest_part = {ncname} ncname |
\r
700 {stringlit} stringliteral;
\r
702 attributetest = T.axis_attribute T.lparenth attributetest_part? T.rparenth;
\r
703 attributetest_part = attribnameorwildcard attributetest_part_part?;
\r
704 attributetest_part_part = T.comma typename;
\r
707 attribnameorwildcard = {attrib} attributename |
\r
710 schemaattributetest = T.fn_schema_attribute T.lparenth attributedeclaration T.rparenth;
\r
712 attributedeclaration = attributename;
\r
714 elementtest = T.fn_element T.lparenth elementtest_part? T.rparenth;
\r
715 elementtest_part = elementnameorwildcard elementtest_part_part?;
\r
716 elementtest_part_part = T.comma typename T.question?;
\r
718 elementnameorwildcard = {element} elementname |
\r
721 schemaelementtest = T.fn_schema_element T.lparenth elementdeclaration T.rparenth;
\r
723 elementdeclaration = elementname;
\r
725 attributename = qname;
\r
727 elementname = qname;
\r
733 * Qualified XML Names
\r
735 qname = {prefixed} prefixedname |
\r
736 {unprefixed} unprefixedname;
\r
738 prefixedname = prefix T.colon localpart;
\r
740 unprefixedname = localpart;
\r
744 localpart = ncname;
\r
748 * Attribute Names for Namespace
\r
750 nsattname = {prefixed} prefixedattname |
\r
751 {default} defaultattname;
\r
753 prefixedattname = T.xmlns T.colon ncname;
\r
755 defaultattname = T.xmlns;
\r
757 ncname = ncnamestartchar ncnamechar*; /* An XML Name, minus the ":" */
\r
759 ncnamestartchar = {letter} T.letter |
\r
760 {underscore} T.underscore ;
\r