[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] [XQuery] FLWOR (for-let-where-order-return) equivalent to FOR (for-order
Hi Folks, I am wondering about the value of the "let" and "where" clause in the XQuery FLWOR expression. I believe that the same capability is possible simply by using a for-order-return expression. If that is true, then I wonder about the value of FLWOR (recent discussions seem to imply that FLWOR is one of the "key advantages" of XQuery). Let me give a couple of examples. Example 1. Let's start with a simple example. Consider this XML document: <?xml version="1.0"?> <Numbers> <Number>0</Number> <Number>8</Number> <Number>23</Number> <Number>17</Number> <Number>5</Number> <Number>19</Number> <Number>44</Number> <Number>13</Number> <Number>78</Number> <Number>21</Number> <Number>2</Number> <Number>1</Number> <Number>15</Number> <Number>67</Number> <Number>99</Number> <Number>14</Number> <Number>8</Number> <Number>33</Number> <Number>50</Number> </Numbers> Problem: output all the numbers less than 20, in ascending sorted order. Here's how to do it using for-where-order-return: for $i in //Number where number($i) <= 20 order by number($i) ascending return $i/text() However, it could just as easily be accomplished with simply for-order-return: for $i in //Number[number(text()) <= 20] order by number($i) ascending return $i/text() Thus, we see that for-order-return has the same capability as for-where-order-return. Example 2. Consider these two XML documents which contain information about Fitness Center members: <?xml version="1.0"?> <MemberNames> <Member id="1"> <Name>Jeff</Name> </Member> <Member id="2"> <Name>David</Name> </Member> . </MemberNames> <?xml version="1.0"?> <MemberAges> ... <Member id="1"> <Age>35</Age> </Member> <Member id="2"> <Age>39</Age> </Member> ... </MemberAges> Problem: Join each Member's Name with their Age. Here's how to do it using for-let-where-order-return: for $i in //Member let $j := doc("MemberAges.xml")//Member[@id eq $i/@id]/Age where number($i/@id) <= 5 order by $i/Name/text() ascending return $i/Name/text(), $j/text() However, it could just as easily be accomplished with simply for-order-return: for $i in //Member[number(@id) <= 5], $j in doc("MemberAges.xml")//Member[@id eq $i/@id]/Age order by $i/Name/text() ascending return $i/Name/text(), $j/text() Thus, we see that for-order-return has the same capability as for-let-where-order-return. Is there something that can be done with for-let-where-order-return which simply cannot be done with for-order-return? If not, then what value is for-let-where-order-return? Is it simply "syntactic sugar"? /Roger
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|