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
90 1 eq 2 and 3 idiv 0 = 1
\r
91 1 eq 1 or 3 idiv 0 = 1
\r
94 --> cast / castable
\r
95 [x] if ($x castable as hatsize)
\r
96 then $x cast as hatsize Error: [1,6] expecting: letter, '_'
\r
100 every $part in /parts/part satisfies $part/@discounted
\r
101 [x] every $xart in (1, 2, 3), $yart in (2, 3, 4)
\r
102 satisfies $xart + $yart = 4
\r
103 [x] some $xart in (1, 2, "cat") satisfies $x * 2 = 4 Error: [1,7] expecting: letter, '_'
\r
106 --> intersect / except
\r
107 $seq1 intersect $seq2
\r
112 [x] $p instance of xs:decimal Error: [1,2] expecting: letter, '_'
\r
113 [x] 5 instance of xs:integer Error: [1,1] expecting: EOF
\r
114 [x] (5, 6) instance of xs:integer+ Error: [1,2] expecting: 'for', 'if', 'some', 'every', ',', '$', '(', ')', '+', '-', '*', '/', '//', '@', '..', '.', 'child', 'descendant', 'attribute', 'self', 'descendant-or-self', 'following-sibling', 'following', 'namespace', 'parent', 'ancestor', 'preceding-sibling', 'preceding', 'ancestor-or-self', 'comment', 'document-node', 'element', 'node', 'processing-instruction', 'schema-attribute', 'schema-element', 'text', letter, '_', integerliteral, decimalliteral, doubleliteral, stringliteral
\r
118 $myaddress treat as element(*, USAddress)
\r
126 * - with defining differences (ex: ncname)
\r
132 basechar = [0x0041..0x005A] | [0x0061..0x007A] | [0x00C0..0x00D6] |
\r
133 [0x00D8..0x00F6] | [0x00F8..0x00FF] | [0x0100..0x0131] |
\r
134 [0x0134..0x013E] | [0x0141..0x0148] | [0x014A..0x017E] |
\r
135 [0x0180..0x01C3] | [0x01CD..0x01F0] | [0x01F4..0x01F5] |
\r
136 [0x01FA..0x0217] | [0x0250..0x02A8] | [0x02BB..0x02C1] |
\r
137 0x0386 | [0x0388..0x038A] | 0x038C | [0x038E..0x03A1] |
\r
138 [0x03A3..0x03CE] | [0x03D0..0x03D6] | 0x03DA | 0x03DC |
\r
139 0x03DE | 0x03E0 | [0x03E2..0x03F3] | [0x0401..0x040C] |
\r
140 [0x040E..0x044F] | [0x0451..0x045C] | [0x045E..0x0481] |
\r
141 [0x0490..0x04C4] | [0x04C7..0x04C8] | [0x04CB..0x04CC] |
\r
142 [0x04D0..0x04EB] | [0x04EE..0x04F5] | [0x04F8..0x04F9] |
\r
143 [0x0531..0x0556] | 0x0559 | [0x0561..0x0586] | [0x05D0..0x05EA] |
\r
144 [0x05F0..0x05F2] | [0x0621..0x063A] | [0x0641..0x064A] |
\r
145 [0x0671..0x06B7] | [0x06BA..0x06BE] | [0x06C0..0x06CE] |
\r
146 [0x06D0..0x06D3] | 0x06D5 | [0x06E5..0x06E6] | [0x0905..0x0939] |
\r
147 0x093D | [0x0958..0x0961] | [0x0985..0x098C] | [0x098F..0x0990] |
\r
148 [0x0993..0x09A8] | [0x09AA..0x09B0] | 0x09B2 | [0x09B6..0x09B9] |
\r
149 [0x09DC..0x09DD] | [0x09DF..0x09E1] | [0x09F0..0x09F1] |
\r
150 [0x0A05..0x0A0A] | [0x0A0F..0x0A10] | [0x0A13..0x0A28] |
\r
151 [0x0A2A..0x0A30] | [0x0A32..0x0A33] | [0x0A35..0x0A36] |
\r
152 [0x0A38..0x0A39] | [0x0A59..0x0A5C] | 0x0A5E | [0x0A72..0x0A74] |
\r
153 [0x0A85..0x0A8B] | 0x0A8D | [0x0A8F..0x0A91] | [0x0A93..0x0AA8] |
\r
154 [0x0AAA..0x0AB0] | [0x0AB2..0x0AB3] | [0x0AB5..0x0AB9] |
\r
155 0x0ABD | 0x0AE0 | [0x0B05..0x0B0C] | [0x0B0F..0x0B10] |
\r
156 [0x0B13..0x0B28] | [0x0B2A..0x0B30] | [0x0B32..0x0B33] |
\r
157 [0x0B36..0x0B39] | 0x0B3D | [0x0B5C..0x0B5D] | [0x0B5F..0x0B61] |
\r
158 [0x0B85..0x0B8A] | [0x0B8E..0x0B90] | [0x0B92..0x0B95] |
\r
159 [0x0B99..0x0B9A] | 0x0B9C | [0x0B9E..0x0B9F] | [0x0BA3..0x0BA4] |
\r
160 [0x0BA8..0x0BAA] | [0x0BAE..0x0BB5] | [0x0BB7..0x0BB9] |
\r
161 [0x0C05..0x0C0C] | [0x0C0E..0x0C10] | [0x0C12..0x0C28] |
\r
162 [0x0C2A..0x0C33] | [0x0C35..0x0C39] | [0x0C60..0x0C61] |
\r
163 [0x0C85..0x0C8C] | [0x0C8E..0x0C90] | [0x0C92..0x0CA8] |
\r
164 [0x0CAA..0x0CB3] | [0x0CB5..0x0CB9] | 0x0CDE | [0x0CE0..0x0CE1] |
\r
165 [0x0D05..0x0D0C] | [0x0D0E..0x0D10] | [0x0D12..0x0D28] |
\r
166 [0x0D2A..0x0D39] | [0x0D60..0x0D61] | [0x0E01..0x0E2E] | 0x0E30 |
\r
167 [0x0E32..0x0E33] | [0x0E40..0x0E45] | [0x0E81..0x0E82] | 0x0E84 |
\r
168 [0x0E87..0x0E88] | 0x0E8A | 0x0E8D | [0x0E94..0x0E97] |
\r
169 [0x0E99..0x0E9F] | [0x0EA1..0x0EA3] | 0x0EA5 | 0x0EA7 |
\r
170 [0x0EAA..0x0EAB] | [0x0EAD..0x0EAE] | 0x0EB0 | [0x0EB2..0x0EB3] |
\r
171 0x0EBD | [0x0EC0..0x0EC4] | [0x0F40..0x0F47] | [0x0F49..0x0F69] |
\r
172 [0x10A0..0x10C5] | [0x10D0..0x10F6] | 0x1100 | [0x1102..0x1103] |
\r
173 [0x1105..0x1107] | 0x1109 | [0x110B..0x110C] | [0x110E..0x1112] |
\r
174 0x113C | 0x113E | 0x1140 | 0x114C | 0x114E | 0x1150 |
\r
175 [0x1154..0x1155] | 0x1159 | [0x115F..0x1161] | 0x1163 |
\r
176 0x1165 | 0x1167 | 0x1169 | [0x116D..0x116E] | [0x1172..0x1173] |
\r
177 0x1175 | 0x119E | 0x11A8 | 0x11AB | [0x11AE..0x11AF] |
\r
178 [0x11B7..0x11B8] | 0x11BA | [0x11BC..0x11C2] | 0x11EB |
\r
179 0x11F0 | 0x11F9 | [0x1E00..0x1E9B] | [0x1EA0..0x1EF9] |
\r
180 [0x1F00..0x1F15] | [0x1F18..0x1F1D] | [0x1F20..0x1F45] |
\r
181 [0x1F48..0x1F4D] | [0x1F50..0x1F57] | 0x1F59 | 0x1F5B |
\r
182 0x1F5D | [0x1F5F..0x1F7D] | [0x1F80..0x1FB4] | [0x1FB6..0x1FBC] |
\r
183 0x1FBE | [0x1FC2..0x1FC4] | [0x1FC6..0x1FCC] | [0x1FD0..0x1FD3] |
\r
184 [0x1FD6..0x1FDB] | [0x1FE0..0x1FEC] | [0x1FF2..0x1FF4] |
\r
185 [0x1FF6..0x1FFC] | 0x2126 | [0x212A..0x212B] | 0x212E |
\r
186 [0x2180..0x2182] | [0x3041..0x3094] | [0x30A1..0x30FA] |
\r
187 [0x3105..0x312C] | [0xAC00..0xD7A3];
\r
189 ideographic = [0x4E00..0x9FA5] | 0x3007 | [0x3021..0x3029];
\r
192 combiningchar = [0x0300..0x0345] | [0x0360..0x0361] | [0x0483..0x0486] |
\r
193 [0x0591..0x05A1] | [0x05A3..0x05B9] | [0x05BB..0x05BD] |
\r
194 0x05BF | [0x05C1..0x05C2] | 0x05C4 | [0x064B..0x0652] |
\r
195 0x0670 | [0x06D6..0x06DC] | [0x06DD..0x06DF] | [0x06E0..0x06E4] |
\r
196 [0x06E7..0x06E8] | [0x06EA..0x06ED] | [0x0901..0x0903] |
\r
197 0x093C | [0x093E..0x094C] | 0x094D | [0x0951..0x0954] |
\r
198 [0x0962..0x0963] | [0x0981..0x0983] | 0x09BC | 0x09BE |
\r
199 0x09BF | [0x09C0..0x09C4] | [0x09C7..0x09C8] | [0x09CB..0x09CD] |
\r
200 0x09D7 | [0x09E2..0x09E3] | 0x0A02 | 0x0A3C | 0x0A3E |
\r
201 0x0A3F | [0x0A40..0x0A42] | [0x0A47..0x0A48] | [0x0A4B..0x0A4D] |
\r
202 [0x0A70..0x0A71] | [0x0A81..0x0A83] | 0x0ABC | [0x0ABE..0x0AC5] |
\r
203 [0x0AC7..0x0AC9] | [0x0ACB..0x0ACD] | [0x0B01..0x0B03] |
\r
204 0x0B3C | [0x0B3E..0x0B43] | [0x0B47..0x0B48] | [0x0B4B..0x0B4D] |
\r
205 [0x0B56..0x0B57] | [0x0B82..0x0B83] | [0x0BBE..0x0BC2] |
\r
206 [0x0BC6..0x0BC8] | [0x0BCA..0x0BCD] | 0x0BD7 | [0x0C01..0x0C03] |
\r
207 [0x0C3E..0x0C44] | [0x0C46..0x0C48] | [0x0C4A..0x0C4D] |
\r
208 [0x0C55..0x0C56] | [0x0C82..0x0C83] | [0x0CBE..0x0CC4] |
\r
209 [0x0CC6..0x0CC8] | [0x0CCA..0x0CCD] | [0x0CD5..0x0CD6] |
\r
210 [0x0D02..0x0D03] | [0x0D3E..0x0D43] | [0x0D46..0x0D48] |
\r
211 [0x0D4A..0x0D4D] | 0x0D57 | 0x0E31 | [0x0E34..0x0E3A] |
\r
212 [0x0E47..0x0E4E] | 0x0EB1 | [0x0EB4..0x0EB9] | [0x0EBB..0x0EBC] |
\r
213 [0x0EC8..0x0ECD] | [0x0F18..0x0F19] | 0x0F35 | 0x0F37 |
\r
214 0x0F39 | 0x0F3E | 0x0F3F | [0x0F71..0x0F84] | [0x0F86..0x0F8B] |
\r
215 [0x0F90..0x0F95] | 0x0F97 | [0x0F99..0x0FAD] | [0x0FB1..0x0FB7] |
\r
216 0x0FB9 | [0x20D0..0x20DC] | 0x20E1 | [0x302A..0x302F] |
\r
219 digit = [ '0' .. '9' ];
\r
221 extender = 0x00B7 | 0x02D0 | 0x02D1 | 0x0387 | 0x0640 | 0x0E46 |
\r
222 0x0EC6 | 0x3005 | [0x3031..0x3035] | [0x309D..0x309E] |
\r
227 * XML names and characters taken (for reference) from these sources
\r
229 * http://www.w3.org/TR/REC-xml-names/#NT-QName
\r
230 * http://www.w3.org/TR/REC-xml-names/#NT-NCName
\r
231 * http://www.w3.org/TR/REC-xml/#NT-NameChar
\r
232 * http://www.w3.org/TR/REC-xml/#NT-Letter
\r
235 letter_helper = basechar |
\r
238 //letter_helper = basechar;
\r
240 //namechar = letter_helper | digit | '.' | '-' | '_' | ':' | combiningchar | extender;
\r
241 namechar = letter_helper | '.' | '-' | '_' | ':' | combiningchar | extender;
\r
242 name = (letter_helper | '_' | ':') (namechar)*;
\r
243 names = name (0x20 name)*;
\r
244 nmtoken = (namechar)+;
\r
245 nmtokens = nmtoken (0x20 nmtoken)*;
\r
246 char = 0x9 | 0xA | 0xD | [0x20-0xD7FF] | [0xE000-0xFFFD] | [0x10000-0x10FFFF];
\r
249 escapequot = '""';
\r
251 doubleliteral_helper = (('.' digit) |
\r
252 (digit ('.' [0-9]*)?)) ('e' | 'E') ('+' | '-')? digit;
\r
253 stringliteral_helper = ( 0x22 (namechar)* 0x22 ) | (''' (namechar)* ''');
\r
259 eol = cr lf | cr | lf; // This takes care of different platforms
\r
264 keyword_return = 'return';
\r
265 keyword_for = 'for';
\r
268 keyword_is = 'is';
\r
269 keyword_satisfies = 'satisfies';
\r
270 keyword_then = 'then';
\r
271 keyword_else = 'else';
\r
273 keyword_and = 'and';
\r
274 keyword_to = 'to';
\r
275 keyword_div = 'div';
\r
276 keyword_idiv = 'idiv';
\r
277 keyword_mod = 'mod';
\r
278 keyword_union = 'union';
\r
279 keyword_intersect = 'intersect';
\r
280 keyword_except = 'except';
\r
281 keyword_instance = 'instance';
\r
283 keyword_treat = 'treat';
\r
285 keyword_castable = 'castable';
\r
286 keyword_cast = 'cast';
\r
287 keyword_some = 'some';
\r
288 keyword_every = 'every';
\r
319 ncomp_precedes = '<<';
\r
320 ncomp_follows = '>>';
\r
325 abbrev_root_desc = '//';
\r
326 abbrev_attrib = '@';
\r
327 abbrev_reversestep = '..';
\r
328 abbrev_context = '.';
\r
336 axis_child = 'child';
\r
337 axis_descendant = 'descendant';
\r
338 axis_attribute = 'attribute';
\r
339 axis_self = 'self';
\r
340 axis_descendant_or_self = 'descendant-or-self';
\r
341 axis_following_sibling = 'following-sibling';
\r
342 axis_following = 'following';
\r
343 axis_namespace = 'namespace';
\r
346 axis_parent = 'parent';
\r
347 axis_ancestor = 'ancestor';
\r
348 axis_preceding_sibling = 'preceding-sibling';
\r
349 axis_preceding = 'preceding';
\r
350 axis_ancestor_or_self = 'ancestor-or-self';
\r
354 * Node Set Functions
\r
356 * function: number last()
\r
357 * function: number position()
\r
358 * function: number count(node-set)
\r
359 * function: node-set id(object)
\r
360 * function: string local-name(node-set?)
\r
361 * function: string namespace-uri(node-set?)
\r
362 * function: string name(node-set?)
\r
368 * function: string string(object?)
\r
369 * function: string concat(string, string, string*)
\r
370 * function: boolean starts-with(string, string)
\r
371 * function: boolean contains(string, string)
\r
372 * function: string substring-before(string, string)
\r
373 * function: string substring-after(string, string)
\r
374 * function: string substring(string, number, number?)
\r
375 * function: number string-length(string?)
\r
376 * function: string normalize-space(string?)
\r
377 * function: string translate(string, string, string)
\r
381 * Boolean Functions
\r
383 * function: boolean boolean(object)
\r
384 * function: boolean not(boolean)
\r
385 * function: boolean true()
\r
386 * function: boolean false()
\r
387 * function: boolean lang(string)
\r
393 * function: number number(object?)
\r
394 * function: number sum(node-set)
\r
395 * function: number floor(number)
\r
396 * function: number ceiling(number)
\r
397 * function: number round(number)
\r
401 * Reserved Function Names
\r
403 //fn_attribute = 'attribute';
\r
404 fn_comment = 'comment';
\r
405 fn_document_node = 'document-node';
\r
406 fn_element = 'element';
\r
407 fn_empty_sequence = 'empty-sequence';
\r
410 fn_processing_instruction = 'processing-instruction';
\r
411 fn_schema_attribute = 'schema-attribute';
\r
412 fn_schema_element = 'schema-element';
\r
414 fn_typeswitch = 'typeswitch';
\r
418 ncnamechar = namechar;
\r
419 //ncnamechar = [namechar - ':'];
\r
421 letter = basechar+;
\r
425 integerliteral = digit+;
\r
427 decimalliteral = ('.' digit+) | (digit+ '.' digit*);
\r
429 doubleliteral = doubleliteral_helper;
\r
431 stringliteral = stringliteral_helper;
\r
433 whitespace = (' ' | tab | eol);
\r
434 comment = '(:' (char)* ':)';
\r
447 expr = exprsingle? expr_part*;
\r
448 expr_part = T.comma exprsingle;
\r
450 exprsingle = {for} forexpr |
\r
451 {quantif} quantifiedexpr |
\r
455 forexpr = simpleforclause T.keyword_return exprsingle;
\r
457 simpleforclause = T.keyword_for T.dollar varname T.keyword_in exprsingle simpleforclause_part*;
\r
458 simpleforclause_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
460 quantifiedexpr = some_every_part T.dollar varname T.keyword_in [exprsingle1]:exprsingle quantifiedexpr_part* T.keyword_satisfies [exprsingle2]:exprsingle;
\r
461 some_every_part = {some} T.keyword_some |
\r
462 {every} T.keyword_every;
\r
463 quantifiedexpr_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
465 ifexpr = T.keyword_if T.lparenth expr T.rparenth T.keyword_then [exprsingle1]:exprsingle T.keyword_else [exprsingle2]:exprsingle;
\r
467 orexpr = andexpr orexpr_part*;
\r
468 orexpr_part = T.keyword_or andexpr;
\r
470 andexpr = comparisonexpr andexpr_part*;
\r
471 andexpr_part = T.keyword_and comparisonexpr;
\r
473 comparisonexpr = rangeexpr comparisonexpr_part?;
\r
474 comparisonexpr_part = comparisonexpr_part_part rangeexpr;
\r
475 comparisonexpr_part_part = {value} valuecomp |
\r
476 {general} generalcomp |
\r
479 rangeexpr = additiveexpr rangeexpr_part?;
\r
480 rangeexpr_part = T.keyword_to additiveexpr;
\r
482 additiveexpr = multiplicativeexpr additiveexpr_part*;
\r
483 additiveexpr_part = additiveexpr_part_part multiplicativeexpr;
\r
484 additiveexpr_part_part = {plus} T.plus2 |
\r
488 multiplicativeexpr = unionexpr multiplicativeexpr_part*;
\r
489 multiplicativeexpr_part = multiplicativeexpr_part_part unionexpr;
\r
490 multiplicativeexpr_part_part = {star} T.star2 |
\r
491 {div} T.keyword_div |
\r
492 {idiv} T.keyword_idiv |
\r
493 {mod} T.keyword_mod;
\r
495 unionexpr = intersectexceptexpr unionexpr_part*;
\r
496 unionexpr_part = unionexpr_part_part intersectexceptexpr;
\r
497 unionexpr_part_part = {unionkey} T.keyword_union |
\r
500 intersectexceptexpr = instanceofexpr intersectexceptexpr_part*;
\r
501 intersectexceptexpr_part = intersectexceptexpr_part_part instanceofexpr;
\r
502 intersectexceptexpr_part_part = {intersect} T.keyword_intersect |
\r
503 {except} T.keyword_except;
\r
505 instanceofexpr = treatexpr instanceofexpr_part?;
\r
506 instanceofexpr_part = T.keyword_instance T.keyword_of sequencetype;
\r
508 treatexpr = castableexpr treatexpr_part?;
\r
509 treatexpr_part = T.keyword_treat T.keyword_as sequencetype;
\r
511 castableexpr = castexpr castableexpr_part?;
\r
512 castableexpr_part = T.keyword_castable T.keyword_as singletype;
\r
514 castexpr = unaryexpr castexpr_part?;
\r
515 castexpr_part = T.keyword_cast T.keyword_as singletype;
\r
517 unaryexpr = unaryexpr_part* valueexpr;
\r
518 unaryexpr_part = {minus} T.minus |
\r
521 valueexpr = pathexpr;
\r
523 generalcomp = {eq} T.equals |
\r
524 {ne} T.ne_abbrev |
\r
525 {lt} T.lt_abbrev |
\r
526 {le} T.le_abbrev |
\r
527 {gt} T.gt_abbrev |
\r
530 valuecomp = {eq} T.eq |
\r
537 nodecomp = {is} T.keyword_is |
\r
538 {ncomppre} T.ncomp_precedes |
\r
539 {ncompfol} T.ncomp_follows;
\r
541 pathexpr = {path1} pathexpr_part_one |
\r
542 {path2} pathexpr_part_two |
\r
543 {relpath} relativepathexpr;
\r
544 pathexpr_part_one = T.abbrev_root relativepathexpr?;
\r
545 pathexpr_part_two = T.abbrev_root_desc relativepathexpr;
\r
547 relativepathexpr = stepexpr relativepathexpr_part*;
\r
548 relativepathexpr_part = relativepathexpr_part_part stepexpr;
\r
549 relativepathexpr_part_part = {root} T.abbrev_root |
\r
550 {rootdesc} T.abbrev_root_desc;
\r
552 stepexpr = {filter} filterexpr |
\r
559 axisstep = axisstep_part predicatelist;
\r
560 axisstep_part = {reverse} reversestep |
\r
561 {forward} forwardstep;
\r
563 forwardstep = {forward} forwardstep_part |
\r
564 {abbrevforward} abbrevforwardstep;
\r
565 forwardstep_part = forwardaxis nodetest;
\r
567 forwardaxis = {forward1} forwardaxis_part_one |
\r
568 {forward2} forwardaxis_part_two |
\r
569 {forward3} forwardaxis_part_three |
\r
570 {forward4} forwardaxis_part_four |
\r
571 {forward5} forwardaxis_part_five |
\r
572 {forward6} forwardaxis_part_six |
\r
573 {forward7} forwardaxis_part_seven |
\r
574 {forward8} forwardaxis_part_eight;
\r
575 forwardaxis_part_one = T.axis_child T.axis_delim;
\r
576 forwardaxis_part_two = T.axis_descendant T.axis_delim;
\r
577 forwardaxis_part_three = T.axis_attribute T.axis_delim;
\r
578 forwardaxis_part_four = T.axis_self T.axis_delim;
\r
579 forwardaxis_part_five = T.axis_descendant_or_self T.axis_delim;
\r
580 forwardaxis_part_six = T.axis_following_sibling T.axis_delim;
\r
581 forwardaxis_part_seven = T.axis_following T.axis_delim;
\r
582 forwardaxis_part_eight = T.axis_namespace T.axis_delim;
\r
584 abbrevforwardstep = T.abbrev_attrib? nodetest;
\r
586 reversestep = {reverse} reversestep_part |
\r
587 {abbrevreverse} abbrevreversestep;
\r
588 reversestep_part = reverseaxis nodetest;
\r
590 reverseaxis = {reverse1} reverseaxis_part_one |
\r
591 {reverse2} reverseaxis_part_two |
\r
592 {reverse3} reverseaxis_part_three |
\r
593 {reverse4} reverseaxis_part_four |
\r
594 {reverse5} reverseaxis_part_five;
\r
595 reverseaxis_part_one = T.axis_parent T.axis_delim;
\r
596 reverseaxis_part_two = T.axis_ancestor T.axis_delim;
\r
597 reverseaxis_part_three = T.axis_preceding_sibling T.axis_delim;
\r
598 reverseaxis_part_four = T.axis_preceding T.axis_delim;
\r
599 reverseaxis_part_five = T.axis_ancestor_or_self T.axis_delim;
\r
602 abbrevreversestep = T.abbrev_reversestep;
\r
604 nodetest = {kind} kindtest |
\r
607 nametest = {qname} qname |
\r
610 wildcard = {star} T.star |
\r
611 {wild1} wildcard_part_one |
\r
612 {wild2} wildcard_part_two;
\r
613 wildcard_part_one = ncname T.colon T.star;
\r
614 wildcard_part_two = T.star T.colon ncname;
\r
616 filterexpr = primaryexpr predicatelist;
\r
618 predicatelist = predicate*;
\r
620 predicate = T.lbracket expr T.rbracket;
\r
622 primaryexpr = {literal} literal |
\r
624 {parenthex} parenthesizedexpr |
\r
625 {contextex} contextitemexpr |
\r
626 {function} functioncall;
\r
628 literal = {numeric} numericliteral |
\r
629 {string} stringliteral;
\r
631 numericliteral = {integer} integerliteral |
\r
632 {decimal} decimalliteral |
\r
633 {double} doubleliteral;
\r
635 varref = T.dollar varname;
\r
639 parenthesizedexpr = T.lparenth expr? T.rparenth;
\r
641 contextitemexpr = T.abbrev_context;
\r
648 functioncall = qname T.lparenth functioncall_part? T.rparenth;
\r
649 functioncall_part = exprsingle functioncall_part_part*;
\r
650 functioncall_part_part = T.comma exprsingle;
\r
653 singletype = atomictype T.question?;
\r
655 sequencetype = {sequencetype1} sequencetype_part_one |
\r
656 {sequencetype2} sequencetype_part_two;
\r
657 sequencetype_part_one = T.fn_empty_sequence T.lparenth T.rparenth;
\r
658 sequencetype_part_two = itemtype occurrenceindicator?;
\r
660 occurrenceindicator = {question} T.question |
\r
665 itemtype = {kind} kindtest |
\r
666 {item} itemtype_part |
\r
667 {atomic} atomictype;
\r
668 itemtype_part = T.fn_item T.lparenth T.rparenth;
\r
670 atomictype = qname;
\r
672 kindtest = {document} documenttest |
\r
673 {element} elementtest |
\r
674 {attribute} attributetest |
\r
675 {schemaelem} schemaelementtest |
\r
676 {schemaattr} schemaattributetest |
\r
678 {comment} commenttest |
\r
680 // {any} anykindtest;
\r
683 //anykindtest = T.fn_node T.lparenth T.rparenth;
\r
684 akindtest = T.fn_node T.lparenth T.rparenth;
\r
686 documenttest = T.fn_document_node T.lparenth documenttest_part? T.rparenth;
\r
687 documenttest_part = {element} elementtest |
\r
688 {schemaelem} schemaelementtest;
\r
691 texttest = T.fn_text T.lparenth T.rparenth;
\r
693 commenttest = T.fn_comment T.lparenth T.rparenth;
\r
695 pitest = T.fn_processing_instruction T.lparenth pitest_part? T.rparenth;
\r
696 pitest_part = {ncname} ncname |
\r
697 {stringlit} stringliteral;
\r
699 attributetest = T.axis_attribute T.lparenth attributetest_part? T.rparenth; //fn_attribute doesn't work
\r
700 attributetest_part = attribnameorwildcard attributetest_part_part?;
\r
701 attributetest_part_part = T.comma typename;
\r
704 attribnameorwildcard = {attrib} attributename |
\r
707 schemaattributetest = T.fn_schema_attribute T.lparenth attributedeclaration T.rparenth;
\r
709 attributedeclaration = attributename;
\r
711 elementtest = T.fn_element T.lparenth elementtest_part? T.rparenth;
\r
712 elementtest_part = elementnameorwildcard elementtest_part_part?;
\r
713 elementtest_part_part = T.comma typename T.question?;
\r
715 elementnameorwildcard = {element} elementname |
\r
718 schemaelementtest = T.fn_schema_element T.lparenth elementdeclaration T.rparenth;
\r
720 elementdeclaration = elementname;
\r
722 attributename = qname;
\r
724 elementname = qname;
\r
730 * Qualified XML Names
\r
732 qname = {prefixed} prefixedname |
\r
733 {unprefixed} unprefixedname;
\r
735 prefixedname = prefix T.colon localpart;
\r
737 unprefixedname = localpart;
\r
741 localpart = ncname;
\r
745 * Attribute Names for Namespace
\r
747 nsattname = {prefixed} prefixedattname |
\r
748 {default} defaultattname;
\r
750 prefixedattname = T.xmlns T.colon ncname;
\r
752 defaultattname = T.xmlns;
\r
754 ncname = ncnamestartchar ncnamechar*; /* An XML Name, minus the ":" */
\r
757 ncnamestartchar = {letter} T.letter |
\r
758 {underscore} T.underscore ;
\r