<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表达式是否正确?如果有人检查一下会有帮助吗?
答案 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中一样,你通常直接对项目集进行操作:你不需要迭代它们来处理它们一次一个。)