如何使用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
相关产品推荐
相关产品推荐

