在 for 循环中带有 if 条件的 XQuery
Posted
技术标签:
【中文标题】在 for 循环中带有 if 条件的 XQuery【英文标题】:XQuery with if condition in for loop 【发布时间】:2015-05-11 21:20:01 【问题描述】:我已经编写了 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>
现在,我必须过滤掉 在 for 循环中使用某些条件的结果,例如
(pseudo logic)
if id = 'abc' and status ="closed"
then skip the row
else add row.
我尝试了几种方法。但无法运行查询..
【问题讨论】:
请阅读How to post an SSCCE 和How to Ask。您的问题缺少示例输入,这将导致长时间的讨论(“仍然对我不起作用”)或使问题几乎无法回答。无论如何,我很确定您根本不需要 if 语句,看看谓词和 where 子句,它们都是 very 基本和重要的 XQuery 语言结构。不要写“我已经尝试了几种方法”。发布您尝试过的什么,以及它是如何失败的! 【参考方案1】:试试这个:
<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>
请注意,XPath //data:data
可能有很多工作要做,但这是另一回事。
【讨论】:
可能有助于注意几个替代方案。在某些情况下,编写谓词而不是 where 子句可能更有效:for $i in //data:data[not(DATA:ID = 'abc') and @status = "closed")]
。在其他情况下,嵌套在返回中很方便,如return if not($i/DATA:ID = 'abc' and $i/@status = "closed") then $a else $b
【参考方案2】:
您也可以使用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>
【讨论】:
你能在标签周围加一个 iff 吗?以上是关于在 for 循环中带有 if 条件的 XQuery的主要内容,如果未能解决你的问题,请参考以下文章
在带有许多 if 语句的 for 循环中使用 continue 时性能是不是有所提高?