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 выражение.

Другие вопросы по тегам