One of the major benefits of FLWORs is that they can easily join data from multiple sources. For example, suppose you want to join information from your product catalog (catalog.xml
) and your order (order.xml
). You want a list of all the items in the order, along with their number, name, and quantity.
The name comes from the product catalog, and the quantity comes from the order. The product number appears in both input documents, so it is used to join the two sources. Example 1-11 shows a FLWOR that performs this join.
Example 1-11. Joining multiple input documents
Query for $item in doc("order.xml")//item let $name := doc("catalog.xml")//product[number = $item/@num]/name return <item num="{$item/@num}" name="{$name}" quan="{$item/@quantity}"/> Results <item num="557" name="Fleece Pullover" quan="1"/> <item num="563" name="Floppy Sun Hat" quan="1"/> <item num="443" name="Deluxe Travel Bag" quan="2"/> <item num="784" name="Cotton Dress Shirt" quan="1"/> <item num="784" name="Cotton Dress Shirt" quan="1"/> <item num="557" name="Fleece Pullover" quan="1"/>
The for
clause sets up an iteration through each item
from the order. For each item, the let
clause goes to the product catalog and gets the name of the product. It does this by finding the product
element whose number
child equals the item's num
attribute, and selecting its name
child. Because the FLWOR iterated six times, the results contain one new item
element for each of the six item
elements in the order document. Joins are covered in Chapter 6.
18.117.93.0