如何迭代XQuery路径?

How to iterate XQuery Path?

<Response xmlns="https://**********/token">
   <rows>
      <e>
         <e>1,4507</e>
         <e>1</e>
         <e>2017-02-28T05:10:32.0606654Z</e>
         <e>2017-02-28T05:10:32.2267838Z</e>
         <e>Depart</e>
         <e>Depart</e>
         <e>acct: xxx on 10/2/2015</e>
         <e>16.666131292069704</e>
         <e null="true"/>
         <e>Open</e>
         <e null="true"/>
         <e null="true"/>
         <e null="true"/>
      </e>
      <e>
         <e>1,4507</e>
         <e>2</e>
         <e>2017-02-28T05:10:32.0606654Z</e>
         <e>2017-02-28T05:10:32.2267838Z</e>
         <e>Depart</e>
         <e>Depart</e>
         <e>acct: xxx on 10/2/2015</e>
         <e>16.666131292069704</e>
         <e null="true"/>
         <e>Open</e>
         <e null="true"/>
         <e null="true"/>
         <e null="true"/>
      </e>
   </rows>
   <skip>0</skip>
   <take>126</take>
</Response>

以上是我的xml回复:

我想验证状态为打开的每一行。

打开

declare namespace ns1='https://**********/token';
<Result>
for  $x in //ns1:Response[1]/ns1:rows[1]
return data($x/ns1:e[1]/ns1:e[10]/text())
</Result>

但它没有返回值。它只是在预期结果中给出以下内容。

<Result>for  $x in //ns1:Response[1]/ns1:rows[1]
return data($x/ns1:e[1]/ns1:e[2]/text())</Result>

xquery 表达式是否正确?如果有人检查一下会有帮助吗?

您应该将 XQuery 表达式包装在 {} 中,否则它将被视为字符串文字:

declare namespace ns1='https://**********/token';
<Result>
{
    for  $x in //ns1:Response[1]/ns1:rows[1]
    return data($x/ns1:e[1]/ns1:e[10]/text())
}
</Result>

demo

输出:

<Result>Open</Result>

虽然不清楚预期的输出到底是什么,因为您一直在每个路径步骤上使用精确索引,这将导致表达式一次只匹配一个元素...

如果你只想知道每一行都有 e[10] = "Open" 那么你可以这样做:

<Result>{empty(/ns1:Rows/*/*[10][.!="Open"])}</Result>

(你的问题标题谈到迭代。那是过程性思维。在 XQuery 中,就像在 SQL 中一样,你通常直接对项目集进行操作:你不需要迭代它们来处理它们一次一个。)