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 for $i in (10, 20), $j in (1, 2)
\r
75 return ( $i + $j ) Error: [1,6] expecting: letter, '_'
\r
76 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 every $xart in (1, 2, 3), $yart in (2, 3, 4)
\r
106 satisfies $xart + $yart = 4
\r
107 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 $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
244 name = (letter_helper | '_' | ':') (namechar)*;
\r
246 names = name (0x20 name)*;
\r
248 nmtoken = (namechar)+;
\r
250 nmtokens = nmtoken (0x20 nmtoken)*;
\r
252 char = 0x9 | 0xA | 0xD | [0x20-0xD7FF] | [0xE000-0xFFFD] | [0x10000-0x10FFFF];
\r
254 escapequot = '""';
\r
256 doubleliteral_helper = (('.' digit) |
\r
257 (digit ('.' [0-9]*)?)) ('e' | 'E') ('+' | '-')? digit;
\r
258 stringliteral_helper = ( 0x22 (namechar)* 0x22 ) | (''' (namechar)* ''');
\r
264 eol = cr lf | cr | lf; // This takes care of different platforms
\r
269 keyword_return = 'return';
\r
270 keyword_for = 'for';
\r
273 keyword_is = 'is';
\r
274 keyword_satisfies = 'satisfies';
\r
275 keyword_then = 'then';
\r
276 keyword_else = 'else';
\r
278 keyword_and = 'and';
\r
279 keyword_to = 'to';
\r
280 keyword_div = 'div';
\r
281 keyword_idiv = 'idiv';
\r
282 keyword_mod = 'mod';
\r
283 keyword_union = 'union';
\r
284 keyword_intersect = 'intersect';
\r
285 keyword_except = 'except';
\r
286 keyword_instance = 'instance';
\r
288 keyword_treat = 'treat';
\r
290 keyword_castable = 'castable';
\r
291 keyword_cast = 'cast';
\r
292 keyword_some = 'some';
\r
293 keyword_every = 'every';
\r
324 ncomp_precedes = '<<';
\r
325 ncomp_follows = '>>';
\r
330 abbrev_root_desc = '//';
\r
331 abbrev_attrib = '@';
\r
332 abbrev_reversestep = '..';
\r
333 abbrev_context = '.';
\r
341 axis_child = 'child';
\r
342 axis_descendant = 'descendant';
\r
343 axis_attribute = 'attribute';
\r
344 axis_self = 'self';
\r
345 axis_descendant_or_self = 'descendant-or-self';
\r
346 axis_following_sibling = 'following-sibling';
\r
347 axis_following = 'following';
\r
348 axis_namespace = 'namespace';
\r
351 axis_parent = 'parent';
\r
352 axis_ancestor = 'ancestor';
\r
353 axis_preceding_sibling = 'preceding-sibling';
\r
354 axis_preceding = 'preceding';
\r
355 axis_ancestor_or_self = 'ancestor-or-self';
\r
359 * Node Set Functions
\r
361 * function: number last()
\r
362 * function: number position()
\r
363 * function: number count(node-set)
\r
364 * function: node-set id(object)
\r
365 * function: string local-name(node-set?)
\r
366 * function: string namespace-uri(node-set?)
\r
367 * function: string name(node-set?)
\r
373 * function: string string(object?)
\r
374 * function: string concat(string, string, string*)
\r
375 * function: boolean starts-with(string, string)
\r
376 * function: boolean contains(string, string)
\r
377 * function: string substring-before(string, string)
\r
378 * function: string substring-after(string, string)
\r
379 * function: string substring(string, number, number?)
\r
380 * function: number string-length(string?)
\r
381 * function: string normalize-space(string?)
\r
382 * function: string translate(string, string, string)
\r
386 * Boolean Functions
\r
388 * function: boolean boolean(object)
\r
389 * function: boolean not(boolean)
\r
390 * function: boolean true()
\r
391 * function: boolean false()
\r
392 * function: boolean lang(string)
\r
398 * function: number number(object?)
\r
399 * function: number sum(node-set)
\r
400 * function: number floor(number)
\r
401 * function: number ceiling(number)
\r
402 * function: number round(number)
\r
406 * Reserved Function Names
\r
408 //fn_attribute = 'attribute';
\r
409 fn_comment = 'comment';
\r
410 fn_document_node = 'document-node';
\r
411 fn_element = 'element';
\r
412 fn_empty_sequence = 'empty-sequence';
\r
415 fn_processing_instruction = 'processing-instruction';
\r
416 fn_schema_attribute = 'schema-attribute';
\r
417 fn_schema_element = 'schema-element';
\r
419 fn_typeswitch = 'typeswitch';
\r
424 integerliteral = digit+;
\r
426 letter = basechar+;
\r
428 ncnamechar = namechar;
\r
433 decimalliteral = ('.' digit+) | (digit+ '.' digit*);
\r
435 doubleliteral = doubleliteral_helper;
\r
437 stringliteral = stringliteral_helper;
\r
439 whitespace = (' ' | tab | eol);
\r
440 comment = '(:' (char)* ':)';
\r
453 expr = exprsingle? expr_part*;
\r
454 expr_part = T.comma exprsingle;
\r
456 exprsingle = {for} forexpr |
\r
457 {quantif} quantifiedexpr |
\r
461 forexpr = simpleforclause T.keyword_return exprsingle;
\r
463 simpleforclause = T.keyword_for T.dollar varname T.keyword_in exprsingle simpleforclause_part*;
\r
464 simpleforclause_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
466 quantifiedexpr = some_every_part T.dollar varname T.keyword_in [exprsingle1]:exprsingle quantifiedexpr_part* T.keyword_satisfies [exprsingle2]:exprsingle;
\r
467 some_every_part = {some} T.keyword_some |
\r
468 {every} T.keyword_every;
\r
469 quantifiedexpr_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
471 ifexpr = T.keyword_if T.lparenth expr T.rparenth T.keyword_then [exprsingle1]:exprsingle T.keyword_else [exprsingle2]:exprsingle;
\r
473 orexpr = andexpr orexpr_part*;
\r
474 orexpr_part = T.keyword_or andexpr;
\r
476 andexpr = comparisonexpr andexpr_part*;
\r
477 andexpr_part = T.keyword_and comparisonexpr;
\r
479 comparisonexpr = rangeexpr comparisonexpr_part?;
\r
480 comparisonexpr_part = comparisonexpr_part_part rangeexpr;
\r
481 comparisonexpr_part_part = {value} valuecomp |
\r
482 {general} generalcomp |
\r
485 rangeexpr = additiveexpr rangeexpr_part?;
\r
486 rangeexpr_part = T.keyword_to additiveexpr;
\r
488 additiveexpr = multiplicativeexpr additiveexpr_part*;
\r
489 additiveexpr_part = additiveexpr_part_part multiplicativeexpr;
\r
490 additiveexpr_part_part = {plus} T.plus2 |
\r
494 multiplicativeexpr = unionexpr multiplicativeexpr_part*;
\r
495 multiplicativeexpr_part = multiplicativeexpr_part_part unionexpr;
\r
496 multiplicativeexpr_part_part = {star} T.star2 |
\r
497 {div} T.keyword_div |
\r
498 {idiv} T.keyword_idiv |
\r
499 {mod} T.keyword_mod;
\r
501 unionexpr = intersectexceptexpr unionexpr_part*;
\r
502 unionexpr_part = unionexpr_part_part intersectexceptexpr;
\r
503 unionexpr_part_part = {unionkey} T.keyword_union |
\r
506 intersectexceptexpr = instanceofexpr intersectexceptexpr_part*;
\r
507 intersectexceptexpr_part = intersectexceptexpr_part_part instanceofexpr;
\r
508 intersectexceptexpr_part_part = {intersect} T.keyword_intersect |
\r
509 {except} T.keyword_except;
\r
511 instanceofexpr = treatexpr instanceofexpr_part?;
\r
512 instanceofexpr_part = T.keyword_instance T.keyword_of sequencetype;
\r
514 treatexpr = castableexpr treatexpr_part?;
\r
515 treatexpr_part = T.keyword_treat T.keyword_as sequencetype;
\r
517 castableexpr = castexpr castableexpr_part?;
\r
518 castableexpr_part = T.keyword_castable T.keyword_as singletype;
\r
520 castexpr = unaryexpr castexpr_part?;
\r
521 castexpr_part = T.keyword_cast T.keyword_as singletype;
\r
523 unaryexpr = unaryexpr_part* valueexpr;
\r
524 unaryexpr_part = {minus} T.minus |
\r
527 valueexpr = pathexpr;
\r
529 generalcomp = {eq} T.equals |
\r
530 {ne} T.ne_abbrev |
\r
531 {lt} T.lt_abbrev |
\r
532 {le} T.le_abbrev |
\r
533 {gt} T.gt_abbrev |
\r
536 valuecomp = {eq} T.eq |
\r
543 nodecomp = {is} T.keyword_is |
\r
544 {ncomppre} T.ncomp_precedes |
\r
545 {ncompfol} T.ncomp_follows;
\r
547 pathexpr = {path1} pathexpr_part_one |
\r
548 {path2} pathexpr_part_two |
\r
549 {relpath} relativepathexpr;
\r
550 pathexpr_part_one = T.abbrev_root relativepathexpr?;
\r
551 pathexpr_part_two = T.abbrev_root_desc relativepathexpr;
\r
553 relativepathexpr = stepexpr relativepathexpr_part*;
\r
554 relativepathexpr_part = relativepathexpr_part_part stepexpr;
\r
555 relativepathexpr_part_part = {root} T.abbrev_root |
\r
556 {rootdesc} T.abbrev_root_desc;
\r
558 stepexpr = {filter} filterexpr |
\r
565 axisstep = axisstep_part predicatelist;
\r
566 axisstep_part = {reverse} reversestep |
\r
567 {forward} forwardstep;
\r
569 forwardstep = {forward} forwardstep_part |
\r
570 {abbrevforward} abbrevforwardstep;
\r
571 forwardstep_part = forwardaxis nodetest;
\r
573 forwardaxis = {forward1} forwardaxis_part_one |
\r
574 {forward2} forwardaxis_part_two |
\r
575 {forward3} forwardaxis_part_three |
\r
576 {forward4} forwardaxis_part_four |
\r
577 {forward5} forwardaxis_part_five |
\r
578 {forward6} forwardaxis_part_six |
\r
579 {forward7} forwardaxis_part_seven |
\r
580 {forward8} forwardaxis_part_eight;
\r
581 forwardaxis_part_one = T.axis_child T.axis_delim;
\r
582 forwardaxis_part_two = T.axis_descendant T.axis_delim;
\r
583 forwardaxis_part_three = T.axis_attribute T.axis_delim;
\r
584 forwardaxis_part_four = T.axis_self T.axis_delim;
\r
585 forwardaxis_part_five = T.axis_descendant_or_self T.axis_delim;
\r
586 forwardaxis_part_six = T.axis_following_sibling T.axis_delim;
\r
587 forwardaxis_part_seven = T.axis_following T.axis_delim;
\r
588 forwardaxis_part_eight = T.axis_namespace T.axis_delim;
\r
590 abbrevforwardstep = T.abbrev_attrib? nodetest;
\r
592 reversestep = {reverse} reversestep_part |
\r
593 {abbrevreverse} abbrevreversestep;
\r
594 reversestep_part = reverseaxis nodetest;
\r
596 reverseaxis = {reverse1} reverseaxis_part_one |
\r
597 {reverse2} reverseaxis_part_two |
\r
598 {reverse3} reverseaxis_part_three |
\r
599 {reverse4} reverseaxis_part_four |
\r
600 {reverse5} reverseaxis_part_five;
\r
601 reverseaxis_part_one = T.axis_parent T.axis_delim;
\r
602 reverseaxis_part_two = T.axis_ancestor T.axis_delim;
\r
603 reverseaxis_part_three = T.axis_preceding_sibling T.axis_delim;
\r
604 reverseaxis_part_four = T.axis_preceding T.axis_delim;
\r
605 reverseaxis_part_five = T.axis_ancestor_or_self T.axis_delim;
\r
608 abbrevreversestep = T.abbrev_reversestep;
\r
610 nodetest = {kind} kindtest |
\r
613 nametest = {qname} qname |
\r
616 wildcard = {star} T.star |
\r
617 {wild1} wildcard_part_one |
\r
618 {wild2} wildcard_part_two;
\r
619 wildcard_part_one = ncname T.colon T.star;
\r
620 wildcard_part_two = T.star T.colon ncname;
\r
622 filterexpr = primaryexpr predicatelist;
\r
624 predicatelist = predicate*;
\r
626 predicate = T.lbracket expr T.rbracket;
\r
628 primaryexpr = {literal} literal |
\r
630 {parenthex} parenthesizedexpr |
\r
631 {contextex} contextitemexpr |
\r
632 {function} functioncall;
\r
634 literal = {numeric} numericliteral |
\r
635 {string} stringliteral;
\r
637 numericliteral = {integer} integerliteral |
\r
638 {decimal} decimalliteral |
\r
639 {double} doubleliteral;
\r
641 varref = T.dollar varname;
\r
645 parenthesizedexpr = T.lparenth expr? T.rparenth;
\r
647 contextitemexpr = T.abbrev_context;
\r
654 functioncall = qname T.lparenth functioncall_part? T.rparenth;
\r
655 functioncall_part = exprsingle functioncall_part_part*;
\r
656 functioncall_part_part = T.comma exprsingle;
\r
659 singletype = atomictype T.question?;
\r
661 sequencetype = {sequencetype1} sequencetype_part_one |
\r
662 {sequencetype2} sequencetype_part_two;
\r
663 sequencetype_part_one = T.fn_empty_sequence T.lparenth T.rparenth;
\r
664 sequencetype_part_two = itemtype occurrenceindicator?;
\r
666 occurrenceindicator = {question} T.question |
\r
671 itemtype = {kind} kindtest |
\r
672 {item} itemtype_part |
\r
673 {atomic} atomictype;
\r
674 itemtype_part = T.fn_item T.lparenth T.rparenth;
\r
676 atomictype = qname;
\r
678 kindtest = {document} documenttest |
\r
679 {element} elementtest |
\r
680 {attribute} attributetest |
\r
681 {schemaelem} schemaelementtest |
\r
682 {schemaattr} schemaattributetest |
\r
684 {comment} commenttest |
\r
686 // {any} anykindtest;
\r
689 //anykindtest = T.fn_node T.lparenth T.rparenth;
\r
690 akindtest = T.fn_node T.lparenth T.rparenth;
\r
692 documenttest = T.fn_document_node T.lparenth documenttest_part? T.rparenth;
\r
693 documenttest_part = {element} elementtest |
\r
694 {schemaelem} schemaelementtest;
\r
697 texttest = T.fn_text T.lparenth T.rparenth;
\r
699 commenttest = T.fn_comment T.lparenth T.rparenth;
\r
701 pitest = T.fn_processing_instruction T.lparenth pitest_part? T.rparenth;
\r
702 pitest_part = {ncname} ncname |
\r
703 {stringlit} stringliteral;
\r
705 attributetest = T.axis_attribute T.lparenth attributetest_part? T.rparenth;
\r
706 attributetest_part = attribnameorwildcard attributetest_part_part?;
\r
707 attributetest_part_part = T.comma typename;
\r
710 attribnameorwildcard = {attrib} attributename |
\r
713 schemaattributetest = T.fn_schema_attribute T.lparenth attributedeclaration T.rparenth;
\r
715 attributedeclaration = attributename;
\r
717 elementtest = T.fn_element T.lparenth elementtest_part? T.rparenth;
\r
718 elementtest_part = elementnameorwildcard elementtest_part_part?;
\r
719 elementtest_part_part = T.comma typename T.question?;
\r
721 elementnameorwildcard = {element} elementname |
\r
724 schemaelementtest = T.fn_schema_element T.lparenth elementdeclaration T.rparenth;
\r
726 elementdeclaration = elementname;
\r
728 attributename = qname;
\r
730 elementname = qname;
\r
736 * Qualified XML Names
\r
738 qname = {prefixed} prefixedname |
\r
739 {unprefixed} unprefixedname;
\r
741 prefixedname = prefix T.colon localpart;
\r
743 unprefixedname = localpart;
\r
747 localpart = ncname;
\r
751 * Attribute Names for Namespace
\r
753 nsattname = {prefixed} prefixedattname |
\r
754 {default} defaultattname;
\r
756 prefixedattname = T.xmlns T.colon ncname;
\r
758 defaultattname = T.xmlns;
\r
760 ncname = ncnamestartchar T.ncnamechar*; /* An XML Name, minus the ":" */
\r
762 ncnamestartchar = {letter} T.letter |
\r
763 {underscore} T.underscore ;
\r