XQuery没有执行

Mar*_*iße 0 xquery saxon

我有一个XQuery问题:

{
let $x := $document//AOSCAT_MetricDetail//table[@class="pretty-table"]
          //tr/td[8]/text()
let $sum_of_statements_per_method := sum(
          for $a at $i in $x where $a != 0.0 return $a 
    )
let $count_of_statements_per_method := count(
          for $a at $i in $x where $a != 0.0 return $a 
    )
return
if ($count_of_statements_per_method != 0) then
    return <average_statements_per_method>{ 
       $sum_of_statements_per_method 
       div 
       $count_of_statements_per_method 
    }</average_statements_per_method>   
else
    return <average_statements_per_method> 
       No data available 
    </average_statements_per_method>    
}
Run Code Online (Sandbox Code Playgroud)

使用Saxon9执行此XQuery会产生以下错误:

Error on line 103 column 39 of transform_2.xq:
  XPST0003: XQuery syntax error in #...verage_statements_per_method>{#:
    expected "else", found ">"
Static error(s) in query
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么.在同一个文件中,有一个非常相似的XQuery表达式,根本就没有问题......

有人能指出我的错误吗?

编辑:但为什么这个工作正常呢?:

{
let $content_check := $document//AOSCAT_MainReport//div[@class="reportpart"][4]/h2/text()
return
if($content_check="Abstraction analysis") then                                                              
let $abstraction := $document//AOSCAT_MainReport//div[@class="reportpart"][4]/table//tr[2]//td[5]
    return <abstraction_level>{ fn:number(fn:normalize-space($abstraction))*100 }</abstraction_level>
else 
    let $abstraction := 0
    return <abstraction_level>{ $abstraction }</abstraction_level>  
}
Run Code Online (Sandbox Code Playgroud)

wst*_*wst 5

你有太多了return.你的代码:

return 
  if (...) then ...
    return ...
  else
    return ...
Run Code Online (Sandbox Code Playgroud)

应该:

return 
  if (...) then ...
  else ...
Run Code Online (Sandbox Code Playgroud)

XQuery的规范定义的if语句为:

IfExpr  ::=  "if" "(" Expr ")" "then" ExprSingle "else" ExprSingle
Run Code Online (Sandbox Code Playgroud)

ExprSingle可以是值或另一个表达式.你的第二个例子是后一种情况:let下面的then分支暗示它是一个FLWOR-type表达式,因此必须包含一个return.简单地说:使用forlet要求return.

有关XQuery语法的更多信息,请参阅在线规范或许多资源,以便更简单地解释它.

  • 你的"这里"指向w3schools.不是第一次,w3schools过于简单化了.虽然"for"和"let"子句都是可选的,但您必须至少有一个"for"或"let"子句.(当我们执行3.0 FLWOR条款时,一些人反对该规则,但我们失败了.) (2认同)