|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the documentation of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 /*! |
|
43 \page xquery-introduction.html |
|
44 \title A Short Path to XQuery |
|
45 |
|
46 \startpage Using XML Technologies |
|
47 \target XQuery-introduction |
|
48 |
|
49 XQuery is a language for querying XML data or non-XML data that can be |
|
50 modeled as XML. XQuery is specified by the \l{http://www.w3.org}{W3C}. |
|
51 |
|
52 \tableofcontents |
|
53 |
|
54 \section1 Introduction |
|
55 |
|
56 Where Java and C++ are \e{statement-based} languages, the XQuery |
|
57 language is \e{expression-based}. The simplest XQuery expression is an |
|
58 XML element constructor: |
|
59 |
|
60 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 20 |
|
61 |
|
62 This \c{<recipe/>} element is an XQuery expression that forms a |
|
63 complete XQuery. In fact, this XQuery doesn't actually query |
|
64 anything. It just creates an empty \c{<recipe/>} element in the |
|
65 output. But \l{Constructing Elements} {constructing new elements in an |
|
66 XQuery} is often necessary. |
|
67 |
|
68 An XQuery expression can also be enclosed in curly braces and embedded |
|
69 in another XQuery expression. This XQuery has a document expression |
|
70 embedded in a node expression: |
|
71 |
|
72 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 21 |
|
73 |
|
74 It creates a new \c{<html>} element in the output and sets its \c{id} |
|
75 attribute to be the \c{id} attribute from an \c{<html>} element in the |
|
76 \c{other.html} file. |
|
77 |
|
78 \section1 Using Path Expressions To Match & Select Items |
|
79 |
|
80 In C++ and Java, we write nested \c{for} loops and recursive functions |
|
81 to traverse XML trees in search of elements of interest. In XQuery, we |
|
82 write these iterative and recursive algorithms with \e{path |
|
83 expressions}. |
|
84 |
|
85 A path expression looks somewhat like a typical \e{file pathname} for |
|
86 locating a file in a hierarchical file system. It is a sequence of one |
|
87 or more \e{steps} separated by slash '/' or double slash '//'. |
|
88 Although path expressions are used for traversing XML trees, not file |
|
89 systems, in QtXmlPatterms we can model a file system to look like an |
|
90 XML tree, so in QtXmlPatterns we can use XQuery to traverse a file |
|
91 system. See the \l {File System Example} {file system example}. |
|
92 |
|
93 Think of a path expression as an algorithm for traversing an XML tree |
|
94 to find and collect items of interest. This algorithm is evaluated by |
|
95 evaluating each step moving from left to right through the sequence. A |
|
96 step is evaluated with a set of input items (nodes and atomic values), |
|
97 sometimes called the \e focus. The step is evaluated for each item in |
|
98 the focus. These evaluations produce a new set of items, called the \e |
|
99 result, which then becomes the focus that is passed to the next step. |
|
100 Evaluation of the final step produces the final result, which is the |
|
101 result of the XQuery. The items in the result set are presented in |
|
102 \l{http://www.w3.org/TR/xquery/#id-document-order} {document order} |
|
103 and without duplicates. |
|
104 |
|
105 With QtXmlPatterns, a standard way to present the initial focus to a |
|
106 query is to call QXmlQuery::setFocus(). Another common way is to let |
|
107 the XQuery itself create the initial focus by using the first step of |
|
108 the path expression to call the XQuery \c{doc()} function. The |
|
109 \c{doc()} function loads an XML document and returns the \e {document |
|
110 node}. Note that the document node is \e{not} the same as the |
|
111 \e{document element}. The \e{document node} is a node constructed in |
|
112 memory, when the document is loaded. It represents the entire XML |
|
113 document, not the document element. The \e{document element} is the |
|
114 single, top-level XML element in the file. The \c{doc()} function |
|
115 returns the document node, which becomes the singleton node in the |
|
116 initial focus set. The document node will have one child node, and |
|
117 that child node will represent the document element. Consider the |
|
118 following XQuery: |
|
119 |
|
120 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 18 |
|
121 |
|
122 The \c{doc()} function loads the \c{cookbook.xml} file and returns the |
|
123 document node. The document node then becomes the focus for the next |
|
124 step \c{//recipe}. Here the double slash means select all \c{<recipe>} |
|
125 elements found below the document node, regardless of where they |
|
126 appear in the document tree. The query selects all \c{<recipe>} |
|
127 elements in the cookbook. See \l{Running The Cookbook Examples} for |
|
128 instructions on how to run this query (and most of the ones that |
|
129 follow) from the command line. |
|
130 |
|
131 Conceptually, evaluation of the steps of a path expression is similar |
|
132 to iterating through the same number of nested \e{for} loops. Consider |
|
133 the following XQuery, which builds on the previous one: |
|
134 |
|
135 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 19 |
|
136 |
|
137 This XQuery is a single path expression composed of three steps. The |
|
138 first step creates the initial focus by calling the \c{doc()} |
|
139 function. We can paraphrase what the query engine does at each step: |
|
140 |
|
141 \list 1 |
|
142 \o for each node in the initial focus (the document node)... |
|
143 \o for each descendant node that is a \c{<recipe>} element... |
|
144 \o collect the child nodes that are \c{<title>} elements. |
|
145 \endlist |
|
146 |
|
147 Again the double slash means select all the \c{<recipe>} elements in the |
|
148 document. The single slash before the \c{<title>} element means select |
|
149 only those \c{<title>} elements that are \e{child} elements of a |
|
150 \c{<recipe>} element (i.e. not grandchildren, etc). The XQuery evaluates |
|
151 to a final result set containing the \c{<title>} element of each |
|
152 \c{<recipe>} element in the cookbook. |
|
153 |
|
154 \section2 Axis Steps |
|
155 |
|
156 The most common kind of path step is called an \e{axis step}, which |
|
157 tells the query engine which way to navigate from the context node, |
|
158 and which test to perform when it encounters nodes along the way. An |
|
159 axis step has two parts, an \e{axis specifier}, and a \e{node test}. |
|
160 Conceptually, evaluation of an axis step proceeds as follows: For each |
|
161 node in the focus set, the query engine navigates out from the node |
|
162 along the specified axis and applies the node test to each node it |
|
163 encounters. The nodes selected by the node test are collected in the |
|
164 result set, which becomes the focus set for the next step. |
|
165 |
|
166 In the example XQuery above, the second and third steps are both axis |
|
167 steps. Both apply the \c{element(name)} node test to nodes encountered |
|
168 while traversing along some axis. But in this example, the two axis |
|
169 steps are written in a \l{Shorthand Form} {shorthand form}, where the |
|
170 axis specifier and the node test are not written explicitly but are |
|
171 implied. XQueries are normally written in this shorthand form, but |
|
172 they can also be written in the longhand form. If we rewrite the |
|
173 XQuery in the longhand form, it looks like this: |
|
174 |
|
175 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 22 |
|
176 |
|
177 The two axis steps have been expanded. The first step (\c{//recipe}) |
|
178 has been rewritten as \c{/descendant-or-self::element(recipe)}, where |
|
179 \c{descendant-or-self::} is the axis specifier and \c{element(recipe)} |
|
180 is the node test. The second step (\c{title}) has been rewritten as |
|
181 \c{/child::element(title)}, where \c{child::} is the axis specifier |
|
182 and \c{element(title)} is the node test. The output of the expanded |
|
183 XQuery will be exactly the same as the output of the shorthand form. |
|
184 |
|
185 To create an axis step, concatenate an axis specifier and a node |
|
186 test. The following sections list the axis specifiers and node tests |
|
187 that are available. |
|
188 |
|
189 \section2 Axis Specifiers |
|
190 |
|
191 An axis specifier defines the direction you want the query engine to |
|
192 take, when it navigates away from the context node. QtXmlPatterns |
|
193 supports the following axes. |
|
194 |
|
195 \table |
|
196 \header |
|
197 \o Axis Specifier |
|
198 \o refers to the axis containing... |
|
199 \row |
|
200 \o \c{self::} |
|
201 \o the context node itself |
|
202 \row |
|
203 \o \c{attribute::} |
|
204 \o all attribute nodes of the context node |
|
205 \row |
|
206 \o \c{child::} |
|
207 \o all child nodes of the context node (not attributes) |
|
208 \row |
|
209 \o \c{descendant::} |
|
210 \o all descendants of the context node (children, grandchildren, etc) |
|
211 \row |
|
212 \o \c{descendant-or-self::} |
|
213 \o all nodes in \c{descendant} + \c{self} |
|
214 \row |
|
215 \o \c{parent::} |
|
216 \o the parent node of the context node, or empty if there is no parent |
|
217 \row |
|
218 \o \c{ancestor::} |
|
219 \o all ancestors of the context node (parent, grandparent, etc) |
|
220 \row |
|
221 \o \c{ancestor-or-self::} |
|
222 \o all nodes in \c{ancestor} + \c{self} |
|
223 \row |
|
224 \o \c{following::} |
|
225 \o all nodes in the tree containing the context node, \e not |
|
226 including \c{descendant}, \e and that follow the context node |
|
227 in the document |
|
228 \row |
|
229 \o \c{preceding::} |
|
230 \o all nodes in the tree contianing the context node, \e not |
|
231 including \c{ancestor}, \e and that precede the context node in |
|
232 the document |
|
233 \row |
|
234 \o \c{following-sibling::} |
|
235 \o all children of the context node's \c{parent} that follow the |
|
236 context node in the document |
|
237 \row |
|
238 \o \c{preceding-sibling::} |
|
239 \o all children of the context node's \c{parent} that precede the |
|
240 context node in the document |
|
241 \endtable |
|
242 |
|
243 \section2 Node Tests |
|
244 |
|
245 A node test is a conditional expression that must be true for a node |
|
246 if the node is to be selected by the axis step. The conditional |
|
247 expression can test just the \e kind of node, or it can test the \e |
|
248 kind of node and the \e name of the node. The XQuery specification for |
|
249 \l{http://www.w3.org/TR/xquery/#node-tests} {node tests} also defines |
|
250 a third condition, the node's \e {Schema Type}, but schema type tests |
|
251 are not supported in QtXmlPatterns. |
|
252 |
|
253 QtXmlPatterns supports the following node tests. The tests that have a |
|
254 \c{name} parameter test the node's name in addition to its \e{kind} |
|
255 and are often called the \l{Name Tests}. |
|
256 |
|
257 \table |
|
258 \header |
|
259 \o Node Test |
|
260 \o matches all... |
|
261 \row |
|
262 \o \c{node()} |
|
263 \o nodes of any kind |
|
264 \row |
|
265 \o \c{text()} |
|
266 \o text nodes |
|
267 \row |
|
268 \o \c{comment()} |
|
269 \o comment nodes |
|
270 \row |
|
271 \o \c{element()} |
|
272 \o element nodes (same as star: *) |
|
273 \row |
|
274 \o \c{element(name)} |
|
275 \o element nodes named \c{name} |
|
276 \row |
|
277 \o \c{attribute()} |
|
278 \o attribute nodes |
|
279 \row |
|
280 \o \c{attribute(name)} |
|
281 \o attribute nodes named \c{name} |
|
282 \row |
|
283 \o \c{processing-instruction()} |
|
284 \o processing-instructions |
|
285 \row |
|
286 \o \c{processing-instruction(name)} |
|
287 \o processing-instructions named \c{name} |
|
288 \row |
|
289 \o \c{document-node()} |
|
290 \o document nodes (there is only one) |
|
291 \row |
|
292 \o \c{document-node(element(name))} |
|
293 \o document node with document element \c{name} |
|
294 \endtable |
|
295 |
|
296 \target Shorthand Form |
|
297 \section2 Shorthand Form |
|
298 |
|
299 Writing axis steps using the longhand form with axis specifiers and |
|
300 node tests is semantically clear but syntactically verbose. The |
|
301 shorthand form is easy to learn and, once you learn it, just as easy |
|
302 to read. In the shorthand form, the axis specifier and node test are |
|
303 implied by the syntax. XQueries are normally written in the shorthand |
|
304 form. Here is a table of some frequently used shorthand forms: |
|
305 |
|
306 \table |
|
307 \header |
|
308 \o Shorthand syntax |
|
309 \o Short for... |
|
310 \o matches all... |
|
311 \row |
|
312 \o \c{name} |
|
313 \o \c{child::element(name)} |
|
314 \o child nodes that are \c{name} elements |
|
315 |
|
316 \row |
|
317 \o \c{*} |
|
318 \o \c{child::element()} |
|
319 \o child nodes that are elements (\c{node()} matches |
|
320 \e all child nodes) |
|
321 |
|
322 \row |
|
323 \o \c{..} |
|
324 \o \c{parent::node()} |
|
325 \o parent nodes (there is only one) |
|
326 |
|
327 \row |
|
328 \o \c{@*} |
|
329 \o \c{attribute::attribute()} |
|
330 \o attribute nodes |
|
331 |
|
332 \row |
|
333 \o \c{@name} |
|
334 \o \c{attribute::attribute(name)} |
|
335 \o \c{name} attributes |
|
336 |
|
337 \row |
|
338 \o \c{//} |
|
339 \o \c{descendant-or-self::node()} |
|
340 \o descendent nodes (when used instead of '/') |
|
341 |
|
342 \endtable |
|
343 |
|
344 The \l{http://www.w3.org/TR/xquery/}{XQuery language specification} |
|
345 has a more detailed section on the shorthand form, which it calls the |
|
346 \l{http://www.w3.org/TR/xquery/#abbrev} {abbreviated syntax}. More |
|
347 examples of path expressions written in the shorthand form are found |
|
348 there. There is also a section listing examples of path expressions |
|
349 written in the \l{http://www.w3.org/TR/xquery/#unabbrev} {longhand |
|
350 form}. |
|
351 |
|
352 \target Name Tests |
|
353 \section2 Name Tests |
|
354 |
|
355 The name tests are the \l{Node Tests} that have the \c{name} |
|
356 parameter. A name test must match the node \e name in addition to the |
|
357 node \e kind. We have already seen name tests used: |
|
358 |
|
359 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 19 |
|
360 |
|
361 In this path expression, both \c{recipe} and \c{title} are name tests |
|
362 written in the shorthand form. XQuery resolves these names |
|
363 (\l{http://www.w3.org/TR/xquery/#id-basics}{QNames}) to their expanded |
|
364 form using whatever |
|
365 \l{http://www.w3.org/TR/xquery/#dt-namespace-declaration} {namespace |
|
366 declarations} it knows about. Resolving a name to its expanded form |
|
367 means replacing its namespace prefix, if one is present (there aren't |
|
368 any present in the example), with a namespace URI. The expanded name |
|
369 then consists of the namespace URI and the local name. |
|
370 |
|
371 But the names in the example above don't have namespace prefixes, |
|
372 because we didn't include a namespace declaration in our |
|
373 \c{cookbook.xml} file. However, we will often use XQuery to query XML |
|
374 documents that use namespaces. Forgetting to declare the correct |
|
375 namespace(s) in an XQuery is a common cause of XQuery failures. Let's |
|
376 add a \e{default} namespace to \c{cookbook.xml} now. Change the |
|
377 \e{document element} in \c{cookbook.xml} from: |
|
378 |
|
379 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 23 |
|
380 |
|
381 to... |
|
382 |
|
383 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 24 |
|
384 |
|
385 This is called a \e{default namespace} declaration because it doesn't |
|
386 include a namespace prefix. By including this default namespace |
|
387 declaration in the document element, we mean that all unprefixed |
|
388 \e{element} names in the document, including the document element |
|
389 itself (\c{cookbook}), are automatically in the default namespace |
|
390 \c{http://cookbook/namespace}. Note that unprefixed \e{attribute} |
|
391 names are not affected by the default namespace declaration. They are |
|
392 always considered to be in \e{no namespace}. Note also that the URL |
|
393 we choose as our namespace URI need not refer to an actual location, |
|
394 and doesn't refer to one in this case. But click on |
|
395 \l{http://www.w3.org/XML/1998/namespace}, for example, which is the |
|
396 namespace URI for elements and attributes prefixed with \c{xml:}. |
|
397 |
|
398 Now when we try to run the previous XQuery example, no output is |
|
399 produced! The path expression no longer matches anything in the |
|
400 cookbook file because our XQuery doesn't yet know about the namespace |
|
401 declaration we added to the cookbook document. There are two ways we |
|
402 can declare the namespace in the XQuery. We can give it a \e{namespace |
|
403 prefix} (e.g. \c{c} for cookbook) and prefix each name test with the |
|
404 namespace prefix: |
|
405 |
|
406 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 3 |
|
407 |
|
408 Or we can declare the namespace to be the \e{default element |
|
409 namespace}, and then we can still run the original XQuery: |
|
410 |
|
411 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 4 |
|
412 |
|
413 Both methods will work and produce the same output, all the |
|
414 \c{<title>} elements: |
|
415 |
|
416 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 5 |
|
417 |
|
418 But note how the output is slightly different from the output we saw |
|
419 before we added the default namespace declaration to the cookbook file. |
|
420 QtXmlPatterns automatically includes the correct namespace attribute |
|
421 in each \c{<title>} element in the output. When QtXmlPatterns loads a |
|
422 document and expands a QName, it creates an instance of QXmlName, |
|
423 which retains the namespace prefix along with the namespace URI and |
|
424 the local name. See QXmlName for further details. |
|
425 |
|
426 One thing to keep in mind from this namespace discussion, whether you |
|
427 run XQueries in a Qt program using QtXmlPatterns, or you run them from |
|
428 the command line using xmlpatterns, is that if you don't get the |
|
429 output you expect, it might be because the data you are querying uses |
|
430 namespaces, but you didn't declare those namespaces in your XQuery. |
|
431 |
|
432 \section3 Wildcards in Name Tests |
|
433 |
|
434 The wildcard \c{'*'} can be used in a name test. To find all the |
|
435 attributes in the cookbook but select only the ones in the \c{xml} |
|
436 namespace, use the \c{xml:} namespace prefix but replace the |
|
437 \e{local name} (the attribute name) with the wildcard: |
|
438 |
|
439 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 7 |
|
440 |
|
441 Oops! If you save this XQuery in \c{file.xq} and run it through |
|
442 \c{xmlpatterns}, it doesn't work. You get an error message instead, |
|
443 something like this: \e{Error SENR0001 in file:///...file.xq, at line |
|
444 1, column 1: Attribute xml:id can't be serialized because it appears |
|
445 at the top level.} The XQuery actually ran correctly. It selected a |
|
446 bunch of \c{xml:id} attributes and put them in the result set. But |
|
447 then \c{xmlpatterns} sent the result set to a \l{QXmlSerializer} |
|
448 {serializer}, which tried to output it as well-formed XML. Since the |
|
449 result set contains only attributes and attributes alone are not |
|
450 well-formed XML, the \l{QXmlSerializer} {serializer} reports a |
|
451 \l{http://www.w3.org/TR/2005/WD-xslt-xquery-serialization-20050915/#id-errors} |
|
452 {serialization error}. |
|
453 |
|
454 Fear not. XQuery can do more than just find and select elements and |
|
455 attributes. It can \l{Constructing Elements} {construct new ones on |
|
456 the fly} as well, which is what we need to do here if we want |
|
457 \c{xmlpatterns} to let us see the attributes we selected. The example |
|
458 above and the ones below are revisited in the \l{Constructing |
|
459 Elements} section. You can jump ahead to see the modified examples |
|
460 now, and then come back, or you can press on from here. |
|
461 |
|
462 To find all the \c{name} attributes in the cookbook and select them |
|
463 all regardless of their namespace, replace the namespace prefix with |
|
464 the wildcard and write \c{name} (the attribute name) as the local |
|
465 name: |
|
466 |
|
467 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 8 |
|
468 |
|
469 To find and select all the attributes of the \e{document element} in |
|
470 the cookbook, replace the entire name test with the wildcard: |
|
471 |
|
472 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 9 |
|
473 |
|
474 \section1 Using Predicates In Path Expressions |
|
475 |
|
476 Predicates can be used to further filter the nodes selected by a path |
|
477 expression. A predicate is an expression in square brackets ('[' and |
|
478 ']') that either returns a boolean value or a number. A predicate can |
|
479 appear at the end of any path step in a path expression. The predicate |
|
480 is applied to each node in the focus set. If a node passes the |
|
481 filter, the node is included in the result set. The query below |
|
482 selects the recipe element that has the \c{<title>} element |
|
483 \c{"Hard-Boiled Eggs"}. |
|
484 |
|
485 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 10 |
|
486 |
|
487 The dot expression ('.') can be used in predicates and path |
|
488 expressions to refer to the current context node. The following query |
|
489 uses the dot expression to refer to the current \c{<method>} element. |
|
490 The query selects the empty \c{<method>} elements from the cookbook. |
|
491 |
|
492 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 11 |
|
493 |
|
494 Note that passing the dot expression to the |
|
495 \l{http://www.w3.org/TR/xpath-functions/#func-string-length} |
|
496 {string-length()} function is optional. When |
|
497 \l{http://www.w3.org/TR/xpath-functions/#func-string-length} |
|
498 {string-length()} is called with no parameter, the context node is |
|
499 assumed: |
|
500 |
|
501 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 12 |
|
502 |
|
503 Actually, selecting an empty \c{<method>} element might not be very |
|
504 useful by itself. It doesn't tell you which recipe has the empty |
|
505 method: |
|
506 |
|
507 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 31 |
|
508 |
|
509 \target Empty Method Not Robust |
|
510 What you probably want to see instead are the \c{<recipe>} elements that |
|
511 have empty \c{<method>} elements: |
|
512 |
|
513 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 32 |
|
514 |
|
515 The predicate uses the |
|
516 \l{http://www.w3.org/TR/xpath-functions/#func-string-length} |
|
517 {string-length()} function to test the length of each \c{<method>} |
|
518 element in each \c{<recipe>} element found by the node test. If a |
|
519 \c{<method>} contains no text, the predicate evaluates to \c{true} and |
|
520 the \c{<recipe>} element is selected. If the method contains some |
|
521 text, the predicate evaluates to \c{false}, and the \c{<recipe>} |
|
522 element is discarded. The output is the entire recipe that has no |
|
523 instructions for preparation: |
|
524 |
|
525 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 33 |
|
526 |
|
527 The astute reader will have noticed that this use of |
|
528 \c{string-length()} to find an empty element is unreliable. It works |
|
529 in this case, because the method element is written as \c{<method/>}, |
|
530 guaranteeing that its string length will be 0. It will still work if |
|
531 the method element is written as \c{<method></method>}, but it will |
|
532 fail if there is any whitespace between the opening and ending |
|
533 \c{<method>} tags. A more robust way to find the recipes with empty |
|
534 methods is presented in the section on \l{Boolean Predicates}. |
|
535 |
|
536 There are many more functions and operators defined for XQuery and |
|
537 XPath. They are all \l{http://www.w3.org/TR/xpath-functions} |
|
538 {documented in the specification}. |
|
539 |
|
540 \section2 Positional Predicates |
|
541 |
|
542 Predicates are often used to filter items based on their position in |
|
543 a sequence. For path expressions processing items loaded from XML |
|
544 documents, the normal sequence is |
|
545 \l{http://www.w3.org/TR/xquery/#id-document-order} {document order}. |
|
546 This query returns the second \c{<recipe>} element in the |
|
547 \c{cookbook.xml} file: |
|
548 |
|
549 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 13 |
|
550 |
|
551 The other frequently used positional function is |
|
552 \l{http://www.w3.org/TR/xpath-functions/#func-last} {last()}, which |
|
553 returns the numeric position of the last item in the focus set. Stated |
|
554 another way, \l{http://www.w3.org/TR/xpath-functions/#func-last} |
|
555 {last()} returns the size of the focus set. This query returns the |
|
556 last recipe in the cookbook: |
|
557 |
|
558 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 16 |
|
559 |
|
560 And this query returns the next to last \c{<recipe>}: |
|
561 |
|
562 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 17 |
|
563 |
|
564 \section2 Boolean Predicates |
|
565 |
|
566 The other kind of predicate evaluates to \e true or \e false. A |
|
567 boolean predicate takes the value of its expression and determines its |
|
568 \e{effective boolean value} according to the following rules: |
|
569 |
|
570 \list |
|
571 \o An expression that evaluates to a single node is \c{true}. |
|
572 |
|
573 \o An expression that evaluates to a string is \c{false} if the |
|
574 string is empty and \c{true} if the string is not empty. |
|
575 |
|
576 \o An expression that evaluates to a boolean value (i.e. type |
|
577 \c{xs:boolean}) is that value. |
|
578 |
|
579 \o If the expression evaluates to anything else, it's an error |
|
580 (e.g. type \c{xs:date}). |
|
581 |
|
582 \endlist |
|
583 |
|
584 We have already seen some boolean predicates in use. Earlier, we saw |
|
585 a \e{not so robust} way to find the \l{Empty Method Not Robust} |
|
586 {recipes that have no instructions}. \c{[string-length(method) = 0]} |
|
587 is a boolean predicate that would fail in the example if the empty |
|
588 method element was written with both opening and closing tags and |
|
589 there was whitespace between the tags. Here is a more robust way that |
|
590 uses a different boolean predicate. |
|
591 |
|
592 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 34 |
|
593 |
|
594 This one uses the |
|
595 \l{http://www.w3.org/TR/xpath-functions/#func-empty} {empty()} and |
|
596 function to test whether the method contains any steps. If the method |
|
597 contains no steps, then \c{empty(step)} will return \c{true}, and |
|
598 hence the predicate will evaluate to \c{true}. |
|
599 |
|
600 But even that version isn't foolproof. Suppose the method does contain |
|
601 steps, but all the steps themselves are empty. That's still a case of |
|
602 a recipe with no instructions that won't be detected. There is a |
|
603 better way: |
|
604 |
|
605 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 35 |
|
606 |
|
607 This version uses the |
|
608 \l{http://www.w3.org/TR/xpath-functions/#func-not} {not} and |
|
609 \l{http://www.w3.org/TR/xpath-functions/#func-normalize-space} |
|
610 {normalize-space()} functions. \c{normalize-space(method))} returns |
|
611 the contents of the method element as a string, but with all the |
|
612 whitespace normalized, i.e., the string value of each \c{<step>} |
|
613 element will have its whitespace normalized, and then all the |
|
614 normalized step values will be concatenated. If that string is empty, |
|
615 then \c{not()} returns \c{true} and the predicate is \c{true}. |
|
616 |
|
617 We can also use the |
|
618 \l{http://www.w3.org/TR/xpath-functions/#func-position} {position()} |
|
619 function in a comparison to inspect positions with conditional logic. The |
|
620 \l{http://www.w3.org/TR/xpath-functions/#func-position} {position()} |
|
621 function returns the position index of the current context item in the |
|
622 sequence of items: |
|
623 |
|
624 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 14 |
|
625 |
|
626 Note that the first position in the sequence is position 1, not 0. We |
|
627 can also select \e{all} the recipes after the first one: |
|
628 |
|
629 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 15 |
|
630 |
|
631 \target Constructing Elements |
|
632 \section1 Constructing Elements |
|
633 |
|
634 In the section about \l{Wildcards in Name Tests} {using wildcards in |
|
635 name tests}, we saw three simple example XQueries, each of which |
|
636 selected a different list of XML attributes from the cookbook. We |
|
637 couldn't use \c{xmlpatterns} to run these queries, however, because |
|
638 \c{xmlpatterns} sends the XQuery results to a \l{QXmlSerializer} |
|
639 {serializer}, which expects to serialize the results as well-formed |
|
640 XML. Since a list of XML attributes by itself is not well-formed XML, |
|
641 the serializer reported an error for each XQuery. |
|
642 |
|
643 Since an attribute must appear in an element, for each attribute in |
|
644 the result set, we must create an XML element. We can do that using a |
|
645 \l{http://www.w3.org/TR/xquery/#id-for-let} {\e{for} clause} with a |
|
646 \l{http://www.w3.org/TR/xquery/#id-variables} {bound variable}, and a |
|
647 \l{http://www.w3.org/TR/xquery/#id-orderby-return} {\e{return} |
|
648 clause} with an element constructor: |
|
649 |
|
650 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 25 |
|
651 |
|
652 The \e{for} clause produces a sequence of attribute nodes from the result |
|
653 of the path expression. Each attribute node in the sequence is bound |
|
654 to the variable \c{$i}. The \e{return} clause then constructs a \c{<p>} |
|
655 element around the attribute node. Here is the output: |
|
656 |
|
657 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 28 |
|
658 |
|
659 The output contains one \c{<p>} element for each \c{xml:id} attribute |
|
660 in the cookbook. Note that XQuery puts each attribute in the right |
|
661 place in its \c{<p>} element, despite the fact that in the \e{return} |
|
662 clause, the \c{$i} variable is positioned as if it is meant to become |
|
663 \c{<p>} element content. |
|
664 |
|
665 The other two examples from the \l{Wildcards in Name Tests} {wildcard} |
|
666 section can be rewritten the same way. Here is the XQuery that selects |
|
667 all the \c{name} attributes, regardless of namespace: |
|
668 |
|
669 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 26 |
|
670 |
|
671 And here is its output: |
|
672 |
|
673 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 29 |
|
674 |
|
675 And here is the XQuery that selects all the attributes from the |
|
676 \e{document element}: |
|
677 |
|
678 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 27 |
|
679 |
|
680 And here is its output: |
|
681 |
|
682 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 30 |
|
683 |
|
684 \section2 Element Constructors are Expressions |
|
685 |
|
686 Because node constructors are expressions, they can be used in |
|
687 XQueries wherever expressions are allowed. |
|
688 |
|
689 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 40 |
|
690 |
|
691 If \c{cookbook.xml} is loaded without error, a \c{<oppskrift>} element |
|
692 (Norwegian word for recipe) is constructed for each \c{<recipe>} |
|
693 element in the cookbook, and the child nodes of the \c{<recipe>} are |
|
694 copied into the \c{<oppskrift>} element. But if the cookbook document |
|
695 doesn't exist or does not contain well-formed XML, a single |
|
696 \c{<oppskrift>} element is constructed containing an error message. |
|
697 |
|
698 \section1 Constructing Atomic Values |
|
699 |
|
700 XQuery also has atomic values. An atomic value is a value in the value |
|
701 space of one of the built-in datatypes in the \l |
|
702 {http://www.w3.org/TR/xmlschema-2} {XML Schema language}. These |
|
703 \e{atomic types} have built-in operators for doing arithmetic, |
|
704 comparisons, and for converting values to other atomic types. See the |
|
705 \l {http://www.w3.org/TR/xmlschema-2/#built-in-datatypes} {Built-in |
|
706 Datatype Hierarchy} for the entire tree of built-in, primitive and |
|
707 derived atomic types. \note Click on a data type in the tree for its |
|
708 detailed specification. |
|
709 |
|
710 To construct an atomic value as element content, enclose an expression |
|
711 in curly braces and embed it in the element constructor: |
|
712 |
|
713 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 36 |
|
714 |
|
715 Sending this XQuery through xmlpatterns produces: |
|
716 |
|
717 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 37 |
|
718 |
|
719 To compute the value of an attribute, enclose the expression in |
|
720 curly braces and embed it in the attribute value: |
|
721 |
|
722 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 38 |
|
723 |
|
724 Sending this XQuery through xmlpatterns produces: |
|
725 |
|
726 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 39 |
|
727 |
|
728 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 40 |
|
729 |
|
730 If \c{cookbook.xml} is loaded without error, a \c{<oppskrift>} element |
|
731 (Norweigian word for recipe) is constructed for each \c{<recipe>} |
|
732 element in the cookbook, and the child nodes of the \c{<recipe>} are |
|
733 copied into the \c{<oppskrift>} element. But if the cookbook document |
|
734 doesn't exist or does not contain well-formed XML, a single |
|
735 \c{<oppskrift>} element is constructed containing an error message. |
|
736 |
|
737 \section1 Running The Cookbook Examples |
|
738 |
|
739 Most of the XQuery examples in this document refer to the |
|
740 \c{cookbook.xml} example file from the \l{Recipes Example}. |
|
741 Copy the \c{cookbook.xml} to your current directory, save one of the |
|
742 cookbook XQuery examples in a \c{.xq} file (e.g., \c{file.xq}), and |
|
743 run the XQuery using Qt's command line utility: |
|
744 |
|
745 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 6 |
|
746 |
|
747 \section1 Further Reading |
|
748 |
|
749 There is much more to the XQuery language than we have presented in |
|
750 this short introduction. We will be adding more here in later |
|
751 releases. In the meantime, playing with the \c{xmlpatterns} utility |
|
752 and making modifications to the XQuery examples provided here will be |
|
753 quite informative. An XQuery textbook will be a good investment. |
|
754 |
|
755 You can also ask questions on XQuery mail lists: |
|
756 |
|
757 \list |
|
758 \o |
|
759 \l{http://qt.nokia.com/lists/qt-interest/}{qt-interest} |
|
760 \o |
|
761 \l{http://www.x-query.com/mailman/listinfo/talk}{talk at x-query.com}. |
|
762 \endlist |
|
763 |
|
764 \l{http://www.functx.com/functx/}{FunctX} has a collection of XQuery |
|
765 functions that can be both useful and educational. |
|
766 |
|
767 This introduction contains many links to the specifications, which, of course, |
|
768 are the ultimate source of information about XQuery. They can be a bit |
|
769 difficult, though, so consider investing in a textbook: |
|
770 |
|
771 \list |
|
772 |
|
773 \o \l{http://www.w3.org/TR/xquery/}{XQuery 1.0: An XML Query |
|
774 Language} - the main source for syntax and semantics. |
|
775 |
|
776 \o \l{http://www.w3.org/TR/xpath-functions/}{XQuery 1.0 and XPath |
|
777 2.0 Functions and Operators} - the builtin functions and operators. |
|
778 |
|
779 \endlist |
|
780 |
|
781 \section1 FAQ |
|
782 |
|
783 The answers to these frequently asked questions explain the causes of |
|
784 several common mistakes that most beginners make. Reading through the |
|
785 answers ahead of time might save you a lot of head scratching. |
|
786 |
|
787 \section2 Why didn't my path expression match anything? |
|
788 |
|
789 The most common cause of this bug is failure to declare one or more |
|
790 namespaces in your XQuery. Consider the following query for selecting |
|
791 all the examples in an XHTML document: |
|
792 |
|
793 \quotefile snippets/patternist/simpleHTML.xq |
|
794 |
|
795 It won't match anything because \c{index.html} is an XHTML file, and |
|
796 all XHTML files declare the default namespace |
|
797 \c{"http://www.w3.org/1999/xhtml"} in their top (\c{<html>}) element. |
|
798 But the query doesn't declare this namespace, so the path expression |
|
799 expands \c{html} to \c{{}html} and tries to match that expanded name. |
|
800 But the actual expanded name is |
|
801 \c{{http://www.w3.org/1999/xhtml}html}. One possible fix is to declare the |
|
802 correct default namespace in the XQuery: |
|
803 |
|
804 \quotefile snippets/patternist/simpleXHTML.xq |
|
805 |
|
806 Another common cause of this bug is to confuse the \e{document node} |
|
807 with the top element node. They are different. This query won't match |
|
808 anything: |
|
809 |
|
810 \quotefile snippets/patternist/docPlainHTML.xq |
|
811 |
|
812 The \c{doc()} function returns the \e{document node}, not the top |
|
813 element node (\c{<html>}). Don't forget to match the top element node |
|
814 in the path expression: |
|
815 |
|
816 \quotefile snippets/patternist/docPlainHTML2.xq |
|
817 |
|
818 \section2 What if my input namespace is different from my output namespace? |
|
819 |
|
820 Just remember to declare both namespaces in your XQuery and use them |
|
821 properly. Consider the following query, which is meant to generate |
|
822 XHTML output from XML input: |
|
823 |
|
824 \quotefile snippets/patternist/embedDataInXHTML.xq |
|
825 |
|
826 We want the \c{<html>}, \c{<body>}, and \c{<p>} nodes we create in the |
|
827 output to be in the standard XHTML namespace, so we declare the |
|
828 default namespace to be \c{http://www.w3.org/1999/xhtml}. That's |
|
829 correct for the output, but that same default namespace will also be |
|
830 applied to the node names in the path expression we're trying to match |
|
831 in the input (\c{/tests/test[@status = "failure"]}), which is wrong, |
|
832 because the namespace used in \c{testResult.xml} is perhaps in the |
|
833 empty namespace. So we must declare that namespace too, with a |
|
834 namespace prefix, and then use the prefix with the node names in |
|
835 the path expression. This one will probably work better: |
|
836 |
|
837 \quotefile snippets/patternist/embedDataInXHTML2.xq |
|
838 |
|
839 \section2 Why doesn't my return clause work? |
|
840 |
|
841 Recall that XQuery is an \e{expression-based} language, not |
|
842 \e{statement-based}. Because an XQuery is a lot of expressions, |
|
843 understanding XQuery expression precedence is very important. |
|
844 Consider the following query: |
|
845 |
|
846 \quotefile snippets/patternist/forClause2.xq |
|
847 |
|
848 It looks ok, but it isn't. It is supposed to be a FLWOR expression |
|
849 comprising a \e{for} clause and a \e{return} clause, but it isn't just |
|
850 that. It \e{has} a FLWOR expression, certainly (with the \e{for} and |
|
851 \e{return} clauses), but it \e{also} has an arithmetic expression |
|
852 (\e{+ $d}) dangling at the end because we didn't enclose the return |
|
853 expression in parentheses. |
|
854 |
|
855 Using parentheses to establish precedence is more important in XQuery |
|
856 than in other languages, because XQuery is \e{expression-based}. In |
|
857 In this case, without parantheses enclosing \c{$i + $d}, the return |
|
858 clause only returns \c{$i}. The \c{+$d} will have the result of the |
|
859 FLWOR expression as its left operand. And, since the scope of variable |
|
860 \c{$d} ends at the end of the \e{return} clause, a variable out of |
|
861 scope error will be reported. Correct these problems by using |
|
862 parentheses. |
|
863 |
|
864 \quotefile snippets/patternist/forClause.xq |
|
865 |
|
866 \section2 Why didn't my expression get evaluated? |
|
867 |
|
868 You probably misplaced some curly braces. When you want an expression |
|
869 evaluated inside an element constructor, enclose the expression in |
|
870 curly braces. Without the curly braces, the expression will be |
|
871 interpreted as text. Here is a \c{sum()} expression used in an \c{<e>} |
|
872 element. The table shows cases where the curly braces are missing, |
|
873 misplaced, and placed correctly: |
|
874 |
|
875 \table |
|
876 \header |
|
877 \o element constructor with expression... |
|
878 \o evaluates to... |
|
879 \row |
|
880 \o <e>sum((1, 2, 3))</e> |
|
881 \o <e>sum((1, 2, 3))</e> |
|
882 \row |
|
883 \o <e>sum({(1, 2, 3)})</e> |
|
884 \o <e>sum(1 2 3)</e> |
|
885 \row |
|
886 \o <e>{sum((1, 2, 3))}</e> |
|
887 \o <e>6</e> |
|
888 \endtable |
|
889 |
|
890 \section2 My predicate is correct, so why doesn't it select the right stuff? |
|
891 |
|
892 Either you put your predicate in the wrong place in your path |
|
893 expression, or you forgot to add some parentheses. Consider this |
|
894 input file \c{doc.txt}: |
|
895 |
|
896 \quotefile snippets/patternist/doc.txt |
|
897 |
|
898 Suppose you want the first \c{<span>} element of every \c{<p>} |
|
899 element. Apply a position filter (\c{[1]}) to the \c{/span} path step: |
|
900 |
|
901 \quotefile snippets/patternist/filterOnStep.xq |
|
902 |
|
903 Applying the \c{[1]} filter to the \c{/span} step returns the first |
|
904 \c{<span>} element of each \c{<p>} element: |
|
905 |
|
906 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 41 |
|
907 |
|
908 \note: You can write the same query this way: |
|
909 |
|
910 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 44 |
|
911 |
|
912 Or you can reduce it right down to this: |
|
913 |
|
914 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 45 |
|
915 |
|
916 On the other hand, suppose you really want only one \c{<span>} |
|
917 element, the first one in the document (i.e., you only want the first |
|
918 \c{<span>} element in the first \c{<p>} element). Then you have to do |
|
919 more filtering. There are two ways you can do it. You can apply the |
|
920 \c{[1]} filter in the same place as above but enclose the path |
|
921 expression in parentheses: |
|
922 |
|
923 \quotefile snippets/patternist/filterOnPath.xq |
|
924 |
|
925 Or you can apply a second position filter (\c{[1]} again) to the |
|
926 \c{/p} path step: |
|
927 |
|
928 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 43 |
|
929 |
|
930 Either way the query will return only the first \c{<span>} element in |
|
931 the document: |
|
932 |
|
933 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 42 |
|
934 |
|
935 \section2 Why doesn't my FLWOR behave as expected? |
|
936 |
|
937 The quick answer is you probably expected your XQuery FLWOR to behave |
|
938 just like a C++ \e{for} loop. But they aren't the same. Consider a |
|
939 simple example: |
|
940 |
|
941 \quotefile snippets/patternist/letOrderBy.xq |
|
942 |
|
943 This query evaluates to \e{4 -4 -2 2 -8 8}. The \e{for} clause does |
|
944 set up a \e{for} loop style iteration, which does evaluate the rest of |
|
945 the FLWOR multiple times, one time for each value returned by the |
|
946 \e{in} expression. That much is similar to the C++ \e{for} loop. |
|
947 |
|
948 But consider the \e{return} clause. In C++ if you hit a \e{return} |
|
949 statement, you break out of the \e{for} loop and return from the |
|
950 function with one value. Not so in XQuery. The \e{return} clause is |
|
951 the last clause of the FLWOR, and it means: \e{Append the return value |
|
952 to the result list and then begin the next iteration of the FLWOR}. |
|
953 When the \e{for} clause's \e{in} expression no longer returns a value, |
|
954 the entire result list is returned. |
|
955 |
|
956 Next, consider the \e{order by} clause. It doesn't do any sorting on |
|
957 each iteration of the FLWOR. It just evaluates its expression on each |
|
958 iteration (\c{$a} in this case) to get an ordering value to map to the |
|
959 result item from each iteration. These ordering values are kept in a |
|
960 parallel list. The result list is sorted at the end using the parallel |
|
961 list of ordering values. |
|
962 |
|
963 The last difference to note here is that the \e{let} clause does |
|
964 \e{not} set up an iteration through a sequence of values like the |
|
965 \e{for} clause does. The \e{let} clause isn't a sort of nested loop. |
|
966 It isn't a loop at all. It is just a variable binding. On each |
|
967 iteration, it binds the \e{entire} sequence of values on the right to |
|
968 the variable on the left. In the example above, it binds (4 -4) to |
|
969 \c{$b} on the first iteration, (-2 2) on the second iteration, and (-8 |
|
970 8) on the third iteration. So the following query doesn't iterate |
|
971 through anything, and doesn't do any ordering: |
|
972 |
|
973 \quotefile snippets/patternist/invalidLetOrderBy.xq |
|
974 |
|
975 It binds the entire sequence (2, 3, 1) to \c{$i} one time only; the |
|
976 \e{order by} clause only has one thing to order and hence does |
|
977 nothing, and the query evaluates to 2 3 1, the sequence assigned to |
|
978 \c{$i}. |
|
979 |
|
980 \note We didn't include a \e{where} clause in the example. The |
|
981 \e{where} clause is for filtering results. |
|
982 |
|
983 \section2 Why are my elements created in the wrong order? |
|
984 |
|
985 The short answer is your elements are \e{not} created in the wrong |
|
986 order, because when appearing as operands to a path expression, |
|
987 there is no correct order. Consider the following query, |
|
988 which again uses the input file \c{doc.txt}: |
|
989 |
|
990 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 46 |
|
991 |
|
992 The query finds all the \c{<p>} elements in the file. For each \c{<p>} |
|
993 element, it builds a \c{<p>} element in the output containing the |
|
994 concatenated contents of all the \c{<p>} element's child \c{<span>} |
|
995 elements. Running the query through \c{xmlpatterns} might produce the |
|
996 following output, which is not sorted in the expected order. |
|
997 |
|
998 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 47 |
|
999 |
|
1000 You can use a \e{for} loop to ensure that the order of |
|
1001 the result set corresponds to the order of the input sequence: |
|
1002 |
|
1003 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 48 |
|
1004 |
|
1005 This version produces the same result set but in the expected order: |
|
1006 |
|
1007 \snippet snippets/code/doc_src_qtxmlpatterns.qdoc 49 |
|
1008 |
|
1009 \section2 Why can't I use \c{true} and \c{false} in my XQuery? |
|
1010 |
|
1011 You can, but not by just using the names \c{true} and \c{false} |
|
1012 directly, because they are \l{Name Tests} {name tests} although they look |
|
1013 like boolean constants. The simple way to create the boolean values is |
|
1014 to use the builtin functions \c{true()} and \c{false()} wherever |
|
1015 you want to use \c{true} and \c{false}. The other way is to invoke the |
|
1016 boolean constructor: |
|
1017 |
|
1018 \quotefile snippets/patternist/xsBooleanTrue.xq |
|
1019 */ |