XQuery:返回后在循环中更新变量值

时间:2018-08-21 10:17:53

标签: xquery xquery-3.0

返回后如何在循环中更新变量值?

let $daysList := (1 to functx:days-in-month(xs:date(xs:date(current-date()))))
let $temp:=0
for $day in $daysList
for $x in doc("booking2.xml")/bookings/booking
    where $x/roomNo = 301
    let $CheckInday := day-from-date(xs:date($x/checkInDate))
    let $CheckOutday := day-from-date(xs:date($x/checkOutDate))
    let $daysDiff := xs:date($x/checkOutDate) - xs:date($x/checkInDate)
    let $daysFromDuration := days-from-duration(xs:dayTimeDuration(xs:dayTimeDuration($daysDiff)))+1
    return 
       if($day >= $CheckInday and $day <= $CheckOutday) then
          if( $day = $CheckInday ) then
             let $temp = 1;
             <td colspan="{$daysFromDuration}" class="btn-success text-center">
               {
                   $x/custFirstName
               }
              </td>

           else ''
        else
          <td>{$day}</td>

在上面的代码中,我想更新$ temp变量的值。 目前不允许我这样做

  

让$ temp:= 1;

有没有实现这些目标的想法。

谢谢。

1 个答案:

答案 0 :(得分:1)

在我看来,您似乎是在尝试模仿过程编程语言中的通用技术,即您在一些输入集合上编写了一个循环,该循环执行以下两项操作:它生成一些与输入中所选项目相对应的输出,并且设置一个标志以指示它在处理过程中发现了某种条件。当然,在变量不可变的功能编程语言中,“设置标志”是不可能的。

通常,处理此问题的最佳方法是将两个操作分开。据我所知,如果要在doc(“ booking2.xml”)/ bookings / booking中有一些$ booking,而在$ daysList中有一些$ day,则要设置标志,以使$ day与checkInDate相同$ booking的金额,即

let $flag := some $x in doc("booking2.xml")/bookings/booking, $day in $days
    satisfies $x/roomNo = 301 and $day eq day-from-date(xs:date($x/checkInDate))

现在您可能会感到(a)这涉及重复的源代码,或者(b)它涉及重复计算同一件事。通常,您可以通过将重复的代码放入函数或变量中来解决这些问题。除非您确实遇到性能问题,否则不要担心性能。

如果事实证明您确实确实存在性能问题,并且在输入上一次传递两个结果都将有助于解决性能问题,则可以修改代码以在单个结果中计算组合结果通过,然后提取合成结果的各个部分。复合结果可能使用XML结构,或者在XQuery 3.1中可能是map