如何迭代XQuery路径?

时间:2017-03-14 07:27:35

标签: xquery soapui

<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回复:

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

打开

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表达式是否正确?如果有人检查一下会有帮助吗?

2 个答案:

答案 0 :(得分:1)

你应该将你的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>

但是,并不清楚预期的输出是什么,因为您已经在每个路径步骤中使用了精确索引,这将导致表达式一次只匹配一个元素...

答案 1 :(得分:1)

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

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

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