在for循环中使用if条件的XQuery

在for循环中使用if条件的XQuery,xquery,marklogic,exist-db,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>

我编写了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>
我试过几种方法。但无法运行查询。

请尝试以下操作:

<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>

{
对于//数据中的$i:data
其中fn:not($i/DATA:ID='abc'和$i/@status=“closed”)
回来
{data($i/data:ID)}
{data($i/@status)}
{data($i/data:title)}
{data($i/data:DISPLAYNAME)}
}
请注意,XPath
//data:data
可能有很多工作要做,但这是另一回事

试试这个:

<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>

{
对于//数据中的$i:data
其中fn:not($i/DATA:ID='abc'和$i/@status=“closed”)
回来
{data($i/data:ID)}
{data($i/@status)}
{data($i/data:title)}
{data($i/data:DISPLAYNAME)}
}

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

您也可以使用
if
条件而不是
where

<result>
{
    for $i in //data:data
    return 
        if($i/DATA:ID != 'abc' and $i/@status != "closed")
        then
        (
            <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>
        )
        else ()
}
</result>

{
对于//数据中的$i:data
回来
如果($i/DATA:ID!=“abc”和$i/@status!=“已关闭”)
然后
(
{data($i/data:ID)}
{data($i/@status)}
{data($i/data:title)}
{data($i/data:DISPLAYNAME)}
)
else()
}

您也可以使用
if
条件而不是
where

<result>
{
    for $i in //data:data
    return 
        if($i/DATA:ID != 'abc' and $i/@status != "closed")
        then
        (
            <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>
        )
        else ()
}
</result>

{
对于//数据中的$i:data
回来
如果($i/DATA:ID!=“abc”和$i/@status!=“已关闭”)
然后
(
{data($i/data:ID)}
{data($i/@status)}
{data($i/data:title)}
{data($i/data:DISPLAYNAME)}
)
else()
}

请阅读并确认。您的问题缺乏示例输入,这将导致长时间的讨论(“对我来说仍然不起作用”),或者使问题几乎无法回答。无论如何,我非常确定您根本不需要if语句,请看一下谓词和where子句,它们都是非常基本和重要的XQuery语言构造。不要写“我已经尝试了几种方法”。发布你的尝试,以及它是如何失败的!请阅读和阅读。您的问题缺乏示例输入,这将导致长时间的讨论(“对我来说仍然不起作用”),或者使问题几乎无法回答。无论如何,我非常确定您根本不需要if语句,请看一下谓词和where子句,它们都是非常基本和重要的XQuery语言构造。不要写“我已经尝试了几种方法”。发布你的尝试,以及它是如何失败的!请注意几个备选方案可能会有所帮助。在某些情况下,在//data:data[not(data:ID='abc')和@status=“closed”)]中为$i编写谓词而不是where子句可能更有效。在其他情况下,可以方便地嵌套在return中,因为
return如果没有($i/DATA:ID='abc'和$i/@status=“closed”),那么$a else$b
可能有助于注意几个备选方案。在某些情况下,在//data:data[not(data:ID='abc')和@status=“closed”)]中为$i编写谓词而不是where子句可能更有效。在其他情况下,可以方便地嵌套在返回中,因为
return如果没有($i/DATA:ID='abc'和$i/@status=“closed”),那么$a或者$b