You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用XQuery检查XML中assert标签的PropertyValues属性是否包含值0011

XQuery实现检查PropertyValues是否包含0011的解决方案

我来帮你解决这个问题,针对你给出的XML结构和PropertyValues的规则(~表示范围、|表示分隔符),我们可以通过自定义函数来处理这些逻辑,最终返回每个assert标签是否包含0011的布尔值。

完整实现代码

<!-- 自定义函数:检查PropertyValues是否包含目标值 -->
declare function local:contains-target($values as xs:string, $target as xs:string) as xs:boolean {
  let $target-integer := xs:integer($target)
  // 按|分割成多个片段
  let $segments := tokenize($values, '\|')
  // 只要有一个片段满足条件,就返回true
  return some $segment in $segments satisfies (
    if (contains($segment, '~')) then
      // 处理范围片段:分割起始和结束值
      let $range-parts := tokenize($segment, '~')
      let $start := xs:integer($range-parts[1])
      let $end := xs:integer($range-parts[2])
      // 检查目标值是否在范围内
      return $target-integer >= $start and $target-integer <= $end
    else
      // 处理单个值片段:直接对比字符串
      $segment eq $target
  )
};

// 遍历所有assert标签,返回对应的检查结果
for $assert in /content/customer/assert
return local:contains-target($assert/@PropertyValues, '0011')

代码逻辑拆解

  • 自定义函数local:contains-target:核心逻辑都在这里,接收两个参数:$values是PropertyValues的属性值,$target是要检查的目标值(这里是0011)。
  • 分割片段:用tokenize($values, '\|')把PropertyValues按|拆分成独立的片段,注意|在正则表达式里是特殊字符,需要用\|转义。
  • 范围处理:如果片段包含~,就把它拆分成起始和结束值,转换成整数后,检查目标值的整数形式是否在这个区间内。
  • 单个值处理:如果是单个值,直接用字符串相等对比(因为你的值都是固定4位的格式,字符串对比和整数对比结果一致)。
  • 短路判断:用some ... satisfies语法,只要有一个片段匹配目标值,就立即返回true,提升效率。

测试结果

针对你提供的XML,运行这段代码会返回以下结果:

  • 第一个<customer id="250">下的两个assert:true(), false()
  • 第二个<customer id="100">下的assert:true()
  • 第三个<customer id="6000">下的assert:false()

内容的提问来源于stack exchange,提问作者Cherry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:24:17