【问题标题】:XQuery: expected "return" found "if(" errorXQuery:预期的“返回”发现“if(”错误
【发布时间】:2018-04-27 18:11:43
【问题描述】:

XML 文件是一个<n> 标签列表,每个标签包含一个数字,在<n> 标签内按数字升序排列。需要求三个是否满足x^2 + y^2 = z^2

这是我的代码:

declare function local:square($k as xs:decimal?)
as xs:decimal? {
   let $sq := ($k * $k) 
   return $sq
};

declare function local:square_sum($a as xs:decimal?,$b as xs:decimal?)
as xs:decimal? {
   let $sqsum := (local:square($a) + local:square($b)) 
   return $sqsum
};

<result>{
let $doc := doc("emp.xml")/list
let $x := 0
let $y := 0

for $z in //n
    let $zconv := xs:decimal($z/text())
    let $lhs := local:square( $zconv )
    let $rhs := local:square_sum($x, $y)
    if ($lhs = $rhs) then (
    return <t>
                <n>{$x}</n>
                <n>{$y}</n>
                <n>{$zconv}</n>
           </t>
    )

}</result>

为什么它没有运行,而是提示我一个错误说:

预期“返回”,发现“if(”

请帮助解决这个问题,同时检查转换为十进制是否可以?对于 $zconv


根据建议将代码更改为:

for $z in //n
let $zconv := xs:decimal($z/text())
let $lhs := local:square( $zconv )
let $rhs := local:square_sum($x, $y)
return if ($lhs = $rhs) 
then (   <t>
            <n>{$x}</n>
            <n>{$y}</n>
            <n>{$zconv}</n>
        </t>
)
else (
    $x := $y
    $y := $zconv
)

现在它说:

应为“)”,发现“:=”

需要更新 $x 和 $y 然后为下一个 n 值重新运行循环,因为需要满足给定条件。

【问题讨论】:

  • XQuery 的语言语义并没有为您提供最近编辑所依赖的那种保证(即承诺被迭代的项目按照它们在输入文档中的顺序进行处理)。如果它确实,那将大大削弱引擎通过并行化循环操作进行优化的能力。
  • re “需要更新 $x 和 $y”:您不能更新 XQuery 中的变量。 (所以是的,“变量”这个名称具有误导性。)换句话说,像$x := $y 这样的形式仅在您声明变量$x 时才允许使用(例如,在@987654326 @ 子句)。您必须想出一种不同的方法来解决问题,一种不涉及更新变量的方法。
  • (顺便说一句,解决此类不依赖于更新变量的问题的一种方法是使用减速器)。

标签: xml xquery


【解决方案1】:

if 不是FLWOR 的有效元素。

一种选择是使用where

where ($lhs = $rhs)
return <t>...</t>

另一个就是将if移动到return中:

return if ($lhs = $rhs) then <t>...</t> else ()

【讨论】:

  • 修改代码,并在查询中引入了更新变量$x和$y语句,现在它显示不同的错误,如更新上面的问题,请更正
  • 如果您有一个新的和不同的问题,那就是……嗯……一个不同的问题。单独询问。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2011-05-10
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
相关资源
最近更新 更多