OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

 


 

   [XQuery] FLWOR (for-let-where-order-return) equivalent to FOR (for-order

[ Lists Home | Date Index | Thread Index ]
  • To: <xml-dev@lists.xml.org>
  • Subject: [XQuery] FLWOR (for-let-where-order-return) equivalent to FOR (for-order-return)?
  • From: "Roger L. Costello" <costello@mitre.org>
  • Date: Sun, 5 Dec 2004 09:43:13 -0500
  • Thread-index: AcTa2L+QeEaQ+dlTT5S3xn7+lx5fAA==

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 







 

News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 2001 XML.org. This site is hosted by OASIS