XQuery

XQuery

(pwalmsley@datypic.com)

ISBN: 0596006349

1st edition, , O'Reilly Media, Inc.

Chapter 6: Selecting and joining using FLWORs

Example 6-1. FLWOR
for $prod in doc("catalog.xml")//product
let $prodDept := $prod/@dept
where $prodDept = "ACC" or $prodDept = "WMN"
return $prod/name
Example 6-2. Using a range expression
for $i in 1 to 3
return <oneEval>{$i}</oneEval>
Example 6-3. Multiple for clauses
for $i in (1, 2)
for $j in ("a", "b")
return <oneEval>i is {$i} and j is {$j}</oneEval>
Example 6-4. Multiple variable bindings in one for clause
for $i in (1, 2), $j in ("a", "b")
return <oneEval>i is {$i} and j is {$j}</oneEval>
Example 6-5. Using a let clause with a range expression
let $i := (1 to 3)
return <oneEval>{$i}</oneEval>
Example 6-6. Intermingled for and let clauses
let $doc := doc("catalog.xml")
for $prod in $doc//product
let $prodDept := $prod/@dept
let $prodName := $prod/name
where $prodDept = "ACC" or $prodDept = "WMN"
return $prodName
Example 6-7. A where clause with multiple expressions
for $prod in doc("catalog.xml")//product
let $prodDept := $prod/@dept
where $prod/number > 100
      and starts-with($prod/name, "F")
      and exists($prod/colorChoices)
      and ($prodDept = "ACC" or $prodDept = "WMN")
return $prod
Example 6-8. Quantified expression using the some keyword
some $dept in doc("catalog.xml")//product/@dept
satisfies ($dept = "ACC")
Example 6-9. Quantified expression using the every keyword
every $dept in doc("catalog.xml")//product/@dept
satisfies ($dept = "ACC")
Example 6-10. Combining the not function with a quantified expression
not(some $dept in doc("catalog.xml")//product/@dept
    satisfies ($dept = "ACC"))
Example 6-11. Binding multiple variables in a quantified expression
some $i in (1 to 3), $j in (10, 11)
  satisfies $j - $i = 7
Example 6-12. Distinctness on a combination of values
let $prods := doc("catalog.xml")//product
for $d in distinct-values($prods/@dept),
    $n in distinct-values($prods[@dept = $d]/number)
return <result dept="{$d}" number="{$n}"/>
Useful function: distinct-deep (see also functx:distinct-deep)
declare namespace functx = "http://www.functx.com";
declare function functx:distinct-deep ($nodes as node()*) as node()*
 {
   for $x in (1 to count($nodes))
   let $node := $nodes[$x]
   let $restOfNodes := subsequence($nodes, $x + 1)
   return if (some $otherNode in $restOfNodes satisfies
              (deep-equal($otherNode, $node)))
          then ()
          else $node
 };
(: Example call :)
functx:distinct-deep(doc("catalog.xml")//product)
Example 6-13. Two-way join in a predicate
for $item in doc("order.xml")//item,
    $product in doc("catalog.xml")//product[number = $item/@num]
return <item num="{$item/@num}"
             name="{$product/name}"
             quan="{$item/@quantity}"/>
Example 6-14. Two-way join in a where clause
for $item in doc("order.xml")//item,
    $product in doc("catalog.xml")//product
where $item/@num = $product/number
return <item num="{$item/@num}"
             name="{$product/name}"
             quan="{$item/@quantity}"/>
Example 6-15. Three-way join in a where clause
for $item in doc("order.xml")//item,
    $product in doc("catalog.xml")//product,
    $price in doc("prices.xml")//prices/priceList/prod
where $item/@num = $product/number and $product/number = $price/@num
return <item num="{$item/@num}"
             name="{$product/name}"
             price="{$price/price}"/>
Example 6-16. Outer join
for $product in doc("catalog.xml")//product
return <product number="{$product/number}">{
                attribute price
                   {for $price in doc("prices.xml")//prices/priceList/prod
                    where $product/number = $price/@num
                    return $price/price}
  }</product>
Datypic XQuery Services