如何迭代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>
输出:
<Result>Open</Result>
虽然不清楚预期的输出到底是什么,因为您一直在每个路径步骤上使用精确索引,这将导致表达式一次只匹配一个元素...
如果你只想知道每一行都有 e[10] = "Open"
那么你可以这样做:
<Result>{empty(/ns1:Rows/*/*[10][.!="Open"])}</Result>
(你的问题标题谈到迭代。那是过程性思维。在 XQuery 中,就像在 SQL 中一样,你通常直接对项目集进行操作:你不需要迭代它们来处理它们一次一个。)
<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>
输出:
<Result>Open</Result>
虽然不清楚预期的输出到底是什么,因为您一直在每个路径步骤上使用精确索引,这将导致表达式一次只匹配一个元素...
如果你只想知道每一行都有 e[10] = "Open"
那么你可以这样做:
<Result>{empty(/ns1:Rows/*/*[10][.!="Open"])}</Result>
(你的问题标题谈到迭代。那是过程性思维。在 XQuery 中,就像在 SQL 中一样,你通常直接对项目集进行操作:你不需要迭代它们来处理它们一次一个。)