Do you read FAQ…?
Somehow I keep people reminding there is a FAQ URL on the XMLDB forum and even then people refuse to read those good examples… Anyway found two great posts I want to share and remember on this, my, web “notepad”. Besides the treewalker example, I tested the examples of those mentioned in the XQuery post on a Oracle 11.2 database.
As far as I could find the treewalker example is part of DOM V2 and not mandatory to implement but I wonder how I can get around the local() stuff, anyway, I will have to investigate a bit further if its just me being a novice in XQuery or that I am missing out on details/info. The XQuery post only demonstrates to me how powerful this extra query language is in an Oracle database and that it is time for me to learn this properly…
The posts that I was referring to:
- Common XQuery mistakes
- The ten most common XSLT programming mistakes
…be aware of the use of the “ (double quote instead single quote), namespaces (indeed apparently always an issue) and using (::) in SQL*Plus… The (::) is needed in SQL*Plus to mark that the “;” is not seen as direct processing instruction for SQL*Plus, but in this case, is for the XQuery engine.
The headlines follow the ones in the XQuery post…
You always need to do something else
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $n := 1
  4           return
  5             if ($n = 1) then
  6              "one"
  7          ' returning content)
  8          as "XMLQuery Output"
  9  from  dual;
from  dual
      *
ERROR at line 9:
ORA-19114: XPST0003 - error during parsing the
XQuery expression:
LPX-00801: XQuery syntax error at 'EOF'
5               "one"
-                    ^
SQL> ! oerr ORA 19114
19114, "XPST0003 - error during parsing the XQuery expression: %s"
// *Cause:  An error occurred during the parsing of the XQuery
            expression.
// *Action: Check the detailed error message for the possible causes.
SQL> !  oerr LPX 00801
00801, 00000, "XQuery syntax error at"
// *Cause:  Invalid XQuery query.
// *Action: Correct the query.
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $n := 1
  4           return
  5             if ($n = 1) then
  6              "one"
  7             else
  8              ()
  9          ' returning content)
 10          as "XMLQuery Output"
 11  from  dual;
XMLQuery Output
--------------------------------------------------
one
Dynamic evaluation is desired
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $xml := text text 
Curly, curly, curly braces
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := "test"
  4           return
  5             {$a} 
  6          ' returning content)
  7          as "XMLQuery Output"
  8  from  dual;
XMLQuery Output
--------------------------------------------------
test 
The desire to return multiple elements is strong
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := "test"
  4           return
  5             {$a} {$a} 
  6          ' returning content)
  7          as "XMLQuery Output"
  8  from  dual;
from  dual
      *
ERROR at line 8:
ORA-19114: XPST0003 - error during parsing the
XQuery expression:
LPX-00801: XQuery syntax error at '>'
4              {$a} {$a} 
-                                 ^
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := "test"
  4           return
  5             ({$a} ,{$a} )
  6          ' returning content)
  7          as "XMLQuery Output"
  8  from  dual;
XMLQuery Output
--------------------------------------------------
test test 
attributes when you mean string
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $node := 
  4           return
  5             element {$node/@name}
  6                     {$node/@content}
  7          ' returning content)
  8          as "XMLQuery Output"
  9  from  dual;
XMLQuery Output
--------------------------------------------------
James Fuller 
Comparing things properly
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := "test"
  4           let $b := "test"
  5           return
  6           fn:compare($a,$b)
  7          ' returning content)
  8          as "XMLQuery Output"
  9  from  dual;
XMLQuery Output
--------------------------------------------------
0
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := "abc"
  4           let $b := "ab"
  5           return
  6           fn:compare($a,$b)
  7          ' returning content)
  8          as "XMLQuery Output"
  9  from  dual;
XMLQuery Output
--------------------------------------------------
1
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := "ab"
  4           let $b := "abc"
  5           return
  6           fn:compare($a,$b)
  7          ' returning content)
  8          as "XMLQuery Output"
  9  from  dual;
XMLQuery Output
--------------------------------------------------
-1
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := (1,2,3)
  4           let $b := (3)
  5           return
  6           $a = $b
  7          ' returning content)
  8          as "XMLQuery Output"
  9  from  dual;
XMLQuery Output
--------------------------------------------------
true
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           let $a := "a"
  4           let $b := "a"
  5           return
  6           if( $a eq $b) then
  7             "string values matched"
  8           else
  9             "string values do not match"
 10          ' returning content)
 11          as "XMLQuery Output"
 12  from  dual;
XMLQuery Output
--------------------------------------------------
string values matched
Empty namespaces conundrum
SQL> set lines 100
SQL> set long 10000
SQL> set pages 5000
SQL> set feed on
SQL> select xmlquery
  2         ('xquery version "1.0"; (: :)
  3           declare default element namespace "http://www.w3.org/1999/xhtml"; (: :)
  4           declare namespace no-namespace = " "; (: :)
  5           let $xml := 
  6                       [no-namespace:element]This element has no namespace[/no]
  7                       
  8           return
  9           $xml//*[namespace-uri() eq " "]
 10          ' returning content)
 11          as "XMLQuery Output"
 12  from  dual;
XMLQuery Output
----------------------------------------------------------------------------------------------------
[no-namespace:element xmlns:no-namespace=" "]This element has no namespace[/no-namespace:element]
1 row selected.
Had to use [ ] brackets here because I still don’t have found a plug-in that doesn’t mess with namespaces on WordPress sites and scrambles the output the moment it encounters namespace notations…
Anyway good to see that Oracle produces the same errors and results.
Next one to read for me  ‘An Introduction to XQuery FLWOR expression‘…
😎