我正在使用xQuery进行SoapUI的自动测试,在尝试验证Tag是否存在时,我遇到了一些问题.我有以下XML:
<Results>
<ResultSet fetchSize="10">
<Row rowNumber="1">
<FCTAAPLI>2309516299-0</FCTAAPLI>
<FDATA>2017-05-05 00:00:00</FDATA>
<FVALOR>0.02</FVALOR>
</Row>
<Row rowNumber="2">
<FCTAAPLI>2312518455-1</FCTAAPLI>
<FDATA>2017-05-05 00:00:00</FDATA>
<FVALOR>0.54</FVALOR>
</Row>
</ResultSet>
</Results>
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下代码:
<Results>
{
for $z in //ResultSet/Row
where $z/FCTAAPLI = "${Properties#NUM_APLICACAO}"
return if (string($z) = "")
then 0
else
number($z/FVALOR)
}
</Results>
Run Code Online (Sandbox Code Playgroud)
编辑:
我想要做的是:循环遍历Row元素,搜索特定的FCTAAPLI编号.如果找到该数字,则应返回FVALOR标记上的值.这一点很好.
问题是,当没有元素匹配所需的FCTAAPLI号时,我想返回0.但是,由于没有返回任何元素,我在验证时遇到了一些麻烦.
当找到FCTAAPLI号码时,一切正常,返回FVALOR,但是当找不到FCTAAPLI时,它只返回标签[<Results />]而不是返回0.我尝试使用空($ z)并存在($ z)但它也没有用.我怎么能解决这个问题?
你的"where"条件是说你只对行所感兴趣$z/FCTAAPLI = "${Properties#NUM_APLICACAO}",但你对问题的描述表明你也想要在不是这种情况的情况下输出.
我不知道背后的想法是什么string($z) = "".示例数据中的所有行都没有零长度的字符串值,因此我不知道这个条件的目的是什么.
在这一点上,我意识到你并没有真正说出你想要查询的内容.你说它在某些条件下有效并且在其他条件下不起作用,但是在不知道应该是什么"正确答案"的情况下很难纠正它.
也许你想要的东西:
<Results>
{
for $z in //ResultSet/Row
return if $z/FCTAAPLI = "${Properties#NUM_APLICACAO}"
then number($z/FVALOR)
else 0
}
</Results>
Run Code Online (Sandbox Code Playgroud)
但这是一个非常疯狂的猜测.
== LATER ==
根据您修改的要求声明,您似乎只是想要
(//ResultSet/Row
[FCTAAPLI = "${Properties#NUM_APLICACAO}"]/number($z/FVALOR), 0)[1]
Run Code Online (Sandbox Code Playgroud)
成语
(a/b/c, $default)[1]
Run Code Online (Sandbox Code Playgroud)
在第一次遇到时看起来很奇怪,但它非常有用:a/b/c如果有一个,则返回选择的第一个项目,$default否则.