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
259 namechar_ws = namechar | ' ';
\r
260 stringliteral_helper = ( 0x22 (namechar_ws)* 0x22 ) | (''' (namechar_ws)* ''');
\r
266 eol = cr lf | cr | lf; // This takes care of different platforms
\r
271 keyword_return = 'return';
\r
272 keyword_for = 'for';
\r
275 keyword_is = 'is';
\r
276 keyword_satisfies = 'satisfies';
\r
277 keyword_then = 'then';
\r
278 keyword_else = 'else';
\r
280 keyword_and = 'and';
\r
281 keyword_to = 'to';
\r
282 keyword_div = 'div';
\r
283 keyword_idiv = 'idiv';
\r
284 keyword_mod = 'mod';
\r
285 keyword_union = 'union';
\r
286 keyword_intersect = 'intersect';
\r
287 keyword_except = 'except';
\r
288 keyword_instance = 'instance';
\r
290 keyword_treat = 'treat';
\r
292 keyword_castable = 'castable';
\r
293 keyword_cast = 'cast';
\r
294 keyword_some = 'some';
\r
295 keyword_every = 'every';
\r
326 ncomp_precedes = '<<';
\r
327 ncomp_follows = '>>';
\r
332 abbrev_root_desc = '//';
\r
333 abbrev_attrib = '@';
\r
334 abbrev_reversestep = '..';
\r
335 abbrev_context = '.';
\r
343 axis_child = 'child';
\r
344 axis_descendant = 'descendant';
\r
345 axis_attribute = 'attribute';
\r
346 axis_self = 'self';
\r
347 axis_descendant_or_self = 'descendant-or-self';
\r
348 axis_following_sibling = 'following-sibling';
\r
349 axis_following = 'following';
\r
350 axis_namespace = 'namespace';
\r
353 axis_parent = 'parent';
\r
354 axis_ancestor = 'ancestor';
\r
355 axis_preceding_sibling = 'preceding-sibling';
\r
356 axis_preceding = 'preceding';
\r
357 axis_ancestor_or_self = 'ancestor-or-self';
\r
361 * Node Set Functions
\r
363 * function: number last()
\r
364 * function: number position()
\r
365 * function: number count(node-set)
\r
366 * function: node-set id(object)
\r
367 * function: string local-name(node-set?)
\r
368 * function: string namespace-uri(node-set?)
\r
369 * function: string name(node-set?)
\r
375 * function: string string(object?)
\r
376 * function: string concat(string, string, string*)
\r
377 * function: boolean starts-with(string, string)
\r
378 * function: boolean contains(string, string)
\r
379 * function: string substring-before(string, string)
\r
380 * function: string substring-after(string, string)
\r
381 * function: string substring(string, number, number?)
\r
382 * function: number string-length(string?)
\r
383 * function: string normalize-space(string?)
\r
384 * function: string translate(string, string, string)
\r
388 * Boolean Functions
\r
390 * function: boolean boolean(object)
\r
391 * function: boolean not(boolean)
\r
392 * function: boolean true()
\r
393 * function: boolean false()
\r
394 * function: boolean lang(string)
\r
400 * function: number number(object?)
\r
401 * function: number sum(node-set)
\r
402 * function: number floor(number)
\r
403 * function: number ceiling(number)
\r
404 * function: number round(number)
\r
408 * Reserved Function Names
\r
410 //fn_attribute = 'attribute';
\r
411 fn_comment = 'comment';
\r
412 fn_document_node = 'document-node';
\r
413 fn_element = 'element';
\r
414 fn_empty_sequence = 'empty-sequence';
\r
417 fn_processing_instruction = 'processing-instruction';
\r
418 fn_schema_attribute = 'schema-attribute';
\r
419 fn_schema_element = 'schema-element';
\r
421 fn_typeswitch = 'typeswitch';
\r
426 integerliteral = digit+;
\r
428 letter = basechar+;
\r
430 ncnamechar = namechar;
\r
435 decimalliteral = ('.' digit+) | (digit+ '.' digit*);
\r
437 doubleliteral = doubleliteral_helper;
\r
439 stringliteral = stringliteral_helper;
\r
441 whitespace = (' ' | tab | eol);
\r
442 comment = '(:' (char)* ':)';
\r
455 expr = exprsingle? expr_part*;
\r
456 expr_part = T.comma exprsingle;
\r
458 exprsingle = {for} forexpr |
\r
459 {quantif} quantifiedexpr |
\r
463 forexpr = simpleforclause T.keyword_return exprsingle;
\r
465 simpleforclause = T.keyword_for T.dollar varname T.keyword_in exprsingle simpleforclause_part*;
\r
466 simpleforclause_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
468 quantifiedexpr = some_every_part T.dollar varname T.keyword_in [exprsingle1]:exprsingle quantifiedexpr_part* T.keyword_satisfies [exprsingle2]:exprsingle;
\r
469 some_every_part = {some} T.keyword_some |
\r
470 {every} T.keyword_every;
\r
471 quantifiedexpr_part = T.comma T.dollar varname T.keyword_in exprsingle;
\r
473 ifexpr = T.keyword_if T.lparenth expr T.rparenth T.keyword_then [exprsingle1]:exprsingle T.keyword_else [exprsingle2]:exprsingle;
\r
475 orexpr = andexpr orexpr_part*;
\r
476 orexpr_part = T.keyword_or andexpr;
\r
478 andexpr = comparisonexpr andexpr_part*;
\r
479 andexpr_part = T.keyword_and comparisonexpr;
\r
481 comparisonexpr = rangeexpr comparisonexpr_part?;
\r
482 comparisonexpr_part = comparisonexpr_part_part rangeexpr;
\r
483 comparisonexpr_part_part = {value} valuecomp |
\r
484 {general} generalcomp |
\r
487 rangeexpr = additiveexpr rangeexpr_part?;
\r
488 rangeexpr_part = T.keyword_to additiveexpr;
\r
490 additiveexpr = multiplicativeexpr additiveexpr_part*;
\r
491 additiveexpr_part = additiveexpr_part_part multiplicativeexpr;
\r
492 additiveexpr_part_part = {plus} T.plus2 |
\r
496 multiplicativeexpr = unionexpr multiplicativeexpr_part*;
\r
497 multiplicativeexpr_part = multiplicativeexpr_part_part unionexpr;
\r
498 multiplicativeexpr_part_part = {star} T.star2 |
\r
499 {div} T.keyword_div |
\r
500 {idiv} T.keyword_idiv |
\r
501 {mod} T.keyword_mod;
\r
503 unionexpr = intersectexceptexpr unionexpr_part*;
\r
504 unionexpr_part = unionexpr_part_part intersectexceptexpr;
\r
505 unionexpr_part_part = {unionkey} T.keyword_union |
\r
508 intersectexceptexpr = instanceofexpr intersectexceptexpr_part*;
\r
509 intersectexceptexpr_part = intersectexceptexpr_part_part instanceofexpr;
\r
510 intersectexceptexpr_part_part = {intersect} T.keyword_intersect |
\r
511 {except} T.keyword_except;
\r
513 instanceofexpr = treatexpr instanceofexpr_part?;
\r
514 instanceofexpr_part = T.keyword_instance T.keyword_of sequencetype;
\r
516 treatexpr = castableexpr treatexpr_part?;
\r
517 treatexpr_part = T.keyword_treat T.keyword_as sequencetype;
\r
519 castableexpr = castexpr castableexpr_part?;
\r
520 castableexpr_part = T.keyword_castable T.keyword_as singletype;
\r
522 castexpr = unaryexpr castexpr_part?;
\r
523 castexpr_part = T.keyword_cast T.keyword_as singletype;
\r
525 unaryexpr = unaryexpr_part* valueexpr;
\r
526 unaryexpr_part = {minus} T.minus |
\r
529 valueexpr = pathexpr;
\r
531 generalcomp = {eq} T.equals |
\r
532 {ne} T.ne_abbrev |
\r
533 {lt} T.lt_abbrev |
\r
534 {le} T.le_abbrev |
\r
535 {gt} T.gt_abbrev |
\r
538 valuecomp = {eq} T.eq |
\r
545 nodecomp = {is} T.keyword_is |
\r
546 {ncomppre} T.ncomp_precedes |
\r
547 {ncompfol} T.ncomp_follows;
\r
549 pathexpr = {path1} pathexpr_part_one |
\r
550 {path2} pathexpr_part_two |
\r
551 {relpath} relativepathexpr;
\r
552 pathexpr_part_one = T.abbrev_root relativepathexpr?;
\r
553 pathexpr_part_two = T.abbrev_root_desc relativepathexpr;
\r
555 relativepathexpr = stepexpr relativepathexpr_part*;
\r
556 relativepathexpr_part = relativepathexpr_part_part stepexpr;
\r
557 relativepathexpr_part_part = {root} T.abbrev_root |
\r
558 {rootdesc} T.abbrev_root_desc;
\r
560 stepexpr = {filter} filterexpr |
\r
567 axisstep = axisstep_part predicatelist;
\r
568 axisstep_part = {reverse} reversestep |
\r
569 {forward} forwardstep;
\r
571 forwardstep = {forward} forwardstep_part |
\r
572 {abbrevforward} abbrevforwardstep;
\r
573 forwardstep_part = forwardaxis nodetest;
\r
575 forwardaxis = {forward1} forwardaxis_part_one |
\r
576 {forward2} forwardaxis_part_two |
\r
577 {forward3} forwardaxis_part_three |
\r
578 {forward4} forwardaxis_part_four |
\r
579 {forward5} forwardaxis_part_five |
\r
580 {forward6} forwardaxis_part_six |
\r
581 {forward7} forwardaxis_part_seven |
\r
582 {forward8} forwardaxis_part_eight;
\r
583 forwardaxis_part_one = T.axis_child T.axis_delim;
\r
584 forwardaxis_part_two = T.axis_descendant T.axis_delim;
\r
585 forwardaxis_part_three = T.axis_attribute T.axis_delim;
\r
586 forwardaxis_part_four = T.axis_self T.axis_delim;
\r
587 forwardaxis_part_five = T.axis_descendant_or_self T.axis_delim;
\r
588 forwardaxis_part_six = T.axis_following_sibling T.axis_delim;
\r
589 forwardaxis_part_seven = T.axis_following T.axis_delim;
\r
590 forwardaxis_part_eight = T.axis_namespace T.axis_delim;
\r
592 abbrevforwardstep = T.abbrev_attrib? nodetest;
\r
594 reversestep = {reverse} reversestep_part |
\r
595 {abbrevreverse} abbrevreversestep;
\r
596 reversestep_part = reverseaxis nodetest;
\r
598 reverseaxis = {reverse1} reverseaxis_part_one |
\r
599 {reverse2} reverseaxis_part_two |
\r
600 {reverse3} reverseaxis_part_three |
\r
601 {reverse4} reverseaxis_part_four |
\r
602 {reverse5} reverseaxis_part_five;
\r
603 reverseaxis_part_one = T.axis_parent T.axis_delim;
\r
604 reverseaxis_part_two = T.axis_ancestor T.axis_delim;
\r
605 reverseaxis_part_three = T.axis_preceding_sibling T.axis_delim;
\r
606 reverseaxis_part_four = T.axis_preceding T.axis_delim;
\r
607 reverseaxis_part_five = T.axis_ancestor_or_self T.axis_delim;
\r
610 abbrevreversestep = T.abbrev_reversestep;
\r
612 nodetest = {kind} kindtest |
\r
615 nametest = {qname} qname |
\r
618 wildcard = {star} T.star |
\r
619 {wild1} wildcard_part_one |
\r
620 {wild2} wildcard_part_two;
\r
621 wildcard_part_one = ncname T.colon T.star;
\r
622 wildcard_part_two = T.star T.colon ncname;
\r
624 filterexpr = primaryexpr predicatelist;
\r
626 predicatelist = predicate*;
\r
628 predicate = T.lbracket expr T.rbracket;
\r
630 primaryexpr = {literal} literal |
\r
632 {parenthex} parenthesizedexpr |
\r
633 {contextex} contextitemexpr |
\r
634 {function} functioncall;
\r
636 literal = {numeric} numericliteral |
\r
637 {string} stringliteral;
\r
639 numericliteral = {integer} integerliteral |
\r
640 {decimal} decimalliteral |
\r
641 {double} doubleliteral;
\r
643 varref = T.dollar varname;
\r
647 parenthesizedexpr = T.lparenth expr? T.rparenth;
\r
649 contextitemexpr = T.abbrev_context;
\r
656 functioncall = qname T.lparenth functioncall_part? T.rparenth;
\r
657 functioncall_part = exprsingle functioncall_part_part*;
\r
658 functioncall_part_part = T.comma exprsingle;
\r
661 singletype = atomictype T.question?;
\r
663 sequencetype = {sequencetype1} sequencetype_part_one |
\r
664 {sequencetype2} sequencetype_part_two;
\r
665 sequencetype_part_one = T.fn_empty_sequence T.lparenth T.rparenth;
\r
666 sequencetype_part_two = itemtype occurrenceindicator?;
\r
668 occurrenceindicator = {question} T.question |
\r
673 itemtype = {kind} kindtest |
\r
674 {item} itemtype_part |
\r
675 {atomic} atomictype;
\r
676 itemtype_part = T.fn_item T.lparenth T.rparenth;
\r
678 atomictype = qname;
\r
680 kindtest = {document} documenttest |
\r
681 {element} elementtest |
\r
682 {attribute} attributetest |
\r
683 {schemaelem} schemaelementtest |
\r
684 {schemaattr} schemaattributetest |
\r
686 {comment} commenttest |
\r
688 // {any} anykindtest;
\r
691 //anykindtest = T.fn_node T.lparenth T.rparenth;
\r
692 akindtest = T.fn_node T.lparenth T.rparenth;
\r
694 documenttest = T.fn_document_node T.lparenth documenttest_part? T.rparenth;
\r
695 documenttest_part = {element} elementtest |
\r
696 {schemaelem} schemaelementtest;
\r
699 texttest = T.fn_text T.lparenth T.rparenth;
\r
701 commenttest = T.fn_comment T.lparenth T.rparenth;
\r
703 pitest = T.fn_processing_instruction T.lparenth pitest_part? T.rparenth;
\r
704 pitest_part = {ncname} ncname |
\r
705 {stringlit} stringliteral;
\r
707 attributetest = T.axis_attribute T.lparenth attributetest_part? T.rparenth;
\r
708 attributetest_part = attribnameorwildcard attributetest_part_part?;
\r
709 attributetest_part_part = T.comma typename;
\r
712 attribnameorwildcard = {attrib} attributename |
\r
715 schemaattributetest = T.fn_schema_attribute T.lparenth attributedeclaration T.rparenth;
\r
717 attributedeclaration = attributename;
\r
719 elementtest = T.fn_element T.lparenth elementtest_part? T.rparenth;
\r
720 elementtest_part = elementnameorwildcard elementtest_part_part?;
\r
721 elementtest_part_part = T.comma typename T.question?;
\r
723 elementnameorwildcard = {element} elementname |
\r
726 schemaelementtest = T.fn_schema_element T.lparenth elementdeclaration T.rparenth;
\r
728 elementdeclaration = elementname;
\r
730 attributename = qname;
\r
732 elementname = qname;
\r
738 * Qualified XML Names
\r
740 qname = {prefixed} prefixedname |
\r
741 {unprefixed} unprefixedname;
\r
743 prefixedname = prefix T.colon localpart;
\r
745 unprefixedname = localpart;
\r
749 localpart = ncname;
\r
753 * Attribute Names for Namespace
\r
755 nsattname = {prefixed} prefixedattname |
\r
756 {default} defaultattname;
\r
758 prefixedattname = T.xmlns T.colon ncname;
\r
760 defaultattname = T.xmlns;
\r
762 ncname = ncnamestartchar T.ncnamechar*; /* An XML Name, minus the ":" */
\r
764 ncnamestartchar = {letter} T.letter |
\r
765 {underscore} T.underscore ;
\r