0

我在解析 REST WebRequest 响应时遇到问题

我正在使用 XQuery

多年来,我使用了一个在我的软件中运行良好的查询(Broadcom 的 OneAutomation,以前是 Automic)我已经将软件更新到下一个主要版本,现在查询仍然有效,但结果总是空的不同的语法但没有成功

这是与旧版本软件一起使用的查询:

for $x in $input/BackgroundProcess/*/Process
return
if (($x/xs:string(@Created) > xs:string("&LastExecution#")) = true()) then
$x/xs:string(@Created)
else ()

变量 &LastExecution# 包含由另一个 GET Webrequest 获取的日期(格式例如:2019-08-06 22:00:15 CEST)。

这是一个响应示例:

<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"/> 
4

2 回答 2

1

我使用最新的 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()
于 2019-08-08T18:21:29.683 回答
0

您说您访问变量的两个示例中的语法似乎是您产品的专有扩展,在标准 XQuery 中,变量引用只是$var.

无论如何,如果您的意图是返回属性节点,或者您的意图是返回属性节点的字符串值,似乎该部分if ($x [@Created > "&LastExcution#"]) then $x可以更改。if ($x [@Created > "&LastExcution#"]) then $x/@Createdif ($x [@Created > "&LastExcution#"]) then xs:string($x/@Created)

一般来说,$input/BackgroundProcess/*/Process/@Created[. > "&LastExcution#"]/string()应该这样做,使用for表达式没有任何收获。但这部分是个人对编码风格的偏好问题,可能是基于我倾向于使用纯 XPath 表达式而不是for表达式。

于 2019-08-08T17:38:40.027 回答