XQuery 获取带条件的属性值



我在解析 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# 包含一个日期(格式例如:2019-08-06 22:00:15 CEST(,该日期由另一个 GET Webrequest 获取。

下面是一个响应示例:

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

我使用最新的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 xs:string($x/@Created)if ($x [@Created > "&LastExcution#"]) then $x部分似乎可以更改为if ($x [@Created > "&LastExcution#"]) then $x/@Created

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

最新更新