XQuery для получения значения атрибута с условием
У меня проблема с анализом ответа REST WebRequest
Я использую XQuery
В течение многих лет я использовал запрос, который отлично работал в моем программном обеспечении (OneAutomation от Broadcom, ранее Automic). Я обновлял программное обеспечение до следующей основной версии, и теперь запрос все еще работает, но результат всегда пуст, я много пробовал. другой синтаксис, но без успеха
Вот запрос, который работал со старой версией программного обеспечения:
for $x in $input/BackgroundProcess/*/Process
return
if (($x/xs:string(@Created) > xs:string("&LastExecution#")) = true()) then
$x/xs:string(@Created)
else ()
Переменная &LastExecution# содержит дату (формат, например: 2019-08-06 22:00:15 CEST), которую получает другой веб-запрос GET.
Вот пример ответа:
<BackgroundProcess>
<Ended>
<Process Created="2019-08-06 22:00:15 CEST" Description="Export started for endpoint 'OIEP_ATTRIBUT' (2019-08-06 22:00:15)" Finished="2019-08-06 22:00:59 CEST" NumberOfErrors="0" NumberOfWarnings="0" Progress="0" StartedBy="STEPSYS" Started="2019-08-06 22:00:20 CEST" Status="succeeded" ID="BGP_1144216"/>
<Process Created="2019-08-07 22:00:27 CEST" Description="Export started for endpoint 'OIEP_ATTRIBUT' (2019-08-07 22:00:27)" Finished="2019-08-07 22:01:15 CEST" NumberOfErrors="0" NumberOfWarnings="0" Progress="0" StartedBy="STEPSYS" Started="2019-08-07 22:00:32 CEST" Status="succeeded" ID="BGP_1152321"/>
</Ended>
</BackgroundProcess>
Ожидаемый результат должен иметь самую последнюю "Созданную" дату, превосходящую дату, переданную в LastExecution #
Любая помощь приветствуется
Редактировать: следующий запрос работает, но мне не удается получить только значение атрибута @Created
for $x in $input/BackgroundProcess/*/Process
return
if ($x [@Created > "&LastExcution#"]) then
$x
else()
Вернуть весь элемент:
<Process Created="2019-08-07 22:00:27 CEST" Description="Export started for endpoint 'OIEP_ATTRIBUT' (2019-08-07 22:00:27)" Finished="2019-08-07 22:01:15 CEST" NumberOfErrors="0" NumberOfWarnings="0" Progress="0" StartedBy="STEPSYS" Started="2019-08-07 22:00:32 CEST" Status="succeeded" ID="BGP_1152321"/>
2 ответа
Я использовал последнюю версию BaseX 9.2.4 для тестирования вашего XQuery. Я закончил со следующим:
XQuery
let $input := <BackgroundProcess>
<Ended>
<Process Created="2019-08-06 22:00:15 CEST" Description="Export started for endpoint 'OIEP_ATTRIBUT' (2019-08-06 22:00:15)" Finished="2019-08-06 22:00:59 CEST" NumberOfErrors="0" NumberOfWarnings="0" Progress="0" StartedBy="STEPSYS" Started="2019-08-06 22:00:20 CEST" Status="succeeded" ID="BGP_1144216"/>
<Process Created="2019-08-07 22:00:27 CEST" Description="Export started for endpoint 'OIEP_ATTRIBUT' (2019-08-07 22:00:27)" Finished="2019-08-07 22:01:15 CEST" NumberOfErrors="0" NumberOfWarnings="0" Progress="0" StartedBy="STEPSYS" Started="2019-08-07 22:00:32 CEST" Status="succeeded" ID="BGP_1152321"/>
</Ended>
</BackgroundProcess>
let $LastExecution := '2019-08-06 22:00:15 CEST'
for $x in $input//Process
return
if ($x [@Created > $LastExecution]) then
data($x/@Created)
else()
Тот синтаксис в обоих примерах, где вы говорите, что обращаетесь к переменной, кажется проприетарным расширением вашего продукта, в стандартном XQuery ссылка на переменную просто $var
,
Во всяком случае, кажется, часть if ($x [@Created > "&LastExcution#"]) then $x
можно просто изменить на if ($x [@Created > "&LastExcution#"]) then $x/@Created
если ваше намерение вернуть узел атрибута или if ($x [@Created > "&LastExcution#"]) then xs:string($x/@Created)
если вы намереваетесь вернуть строковое значение узла атрибута.
В общем, $input/BackgroundProcess/*/Process/@Created[. > "&LastExcution#"]/string()
следует сделать, нет выгоды от использования for
выражение. Но это отчасти вопрос личного предпочтения стиля кодирования и может основываться на моем стремлении использовать простое выражение XPath вместо for
выражение.