Проверьте отсутствующий тег xQuery - PullRequest
0 голосов
/ 24 апреля 2018

Я использую xQuery для автоматического теста с SoapUI, и при попытке проверить, существует ли тег, я столкнулся с некоторой проблемой. У меня есть следующий 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>

Я пытаюсь использовать следующий код:

<Results>
{
for $z in //ResultSet/Row
where $z/FCTAAPLI = "${Properties#NUM_APLICACAO}"

return if (string($z) = "")
then 0
else
number($z/FVALOR)
}
</Results>

EDIT: Я пытаюсь сделать следующее: перебирать элементы Row в поисках определенного номера FCTAAPLI. Если это число найдено, то должно быть возвращено значение в теге FVALOR. Эта точка отлично работает.
Проблема в том, что, когда ни один элемент не соответствует желаемому номеру FCTAAPLI, я хотел бы вернуть 0. Но, поскольку ни один элемент не возвращается, у меня возникают некоторые проблемы при проверке этого.

Когда номер FCTAAPLI найден, все работает нормально, возвращается FVALOR, но когда FCTAAPLI не найден, вместо того, чтобы возвращать 0, он просто возвращает тег []. Я попытался использовать empty ($ z) и Существовать ($ z), но это тоже не сработало. Любая идея о том, как я мог решить это?

1 Ответ

0 голосов
/ 24 апреля 2018

Ваше условие "где" означает, что вас интересуют только строки, где $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>

но это довольно дикое предположение.

== ПОЗЖЕ ==

С вашим пересмотренным заявлением о требованиях, похоже, вы просто хотите

(//ResultSet/Row
   [FCTAAPLI = "${Properties#NUM_APLICACAO}"]/number($z/FVALOR), 0)[1]

идиома

(a/b/c, $default)[1]

выглядит странно при первом столкновении, но это очень полезно: он возвращает первый элемент, выбранный a/b/c, если он есть, или $default в противном случае.

...