for 循环中带有 if 条件的 XQuery

use*_*255 3 xquery marklogic exist-db

我已经编写了 xquery 以正常方式返回结果。

let $results := //data:data
return 
  <result>
  {
    for $i in $results
    return
      <documentInformation>
        <id>{data($i/DATA:ID)}</id>
        <status>{data($i/@status)}</status>
        <title>{data($i/data:title)}</title>
        <displayName>{data($i/DATA:DISPLAYNAME)}</displayName>
      </documentInformation>
  }
  </result>
Run Code Online (Sandbox Code Playgroud)

现在,我必须用一些条件过滤掉 for 循环中的结果,例如

(pseudo logic)
if id = 'abc' and status ="closed"  
then skip the row
else add row.
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法。但无法运行查询..

Dav*_*sel 5

尝试这个:

<result>
{
  for $i in //data:data
  where fn:not($i/DATA:ID = 'abc' and $i/@status = "closed")
  return
    <documentInformation>
      <id>{data($i/DATA:ID)}</id>
      <status>{data($i/@status)}</status>
      <title>{data($i/data:title)}</title>
      <displayName>{data($i/DATA:DISPLAYNAME)}</displayName>
    </documentInformation>
}
</result>
Run Code Online (Sandbox Code Playgroud)

请注意,XPath//data:data可能有很多工作要做,但这是另一回事。

  • 记下几个替代方案可能会有所帮助。在某些情况下,编写谓词而不是 where 子句可能会更有效:`for $i in //data:data[not(DATA:ID = 'abc') and @status = "lined")]`。在其他情况下,嵌套在 return 中也很方便,如 `return if not($i/DATA:ID = 'abc' and $i/@status = "lined") then $a else $b` (2认同)