如何用XQuery检测bracketSequenceNumber重复值并抛出异常
用XQuery检测重复的bracketSequenceNumber并抛出异常
需求说明
当XML中存在多个bracketQualifier节点,且其中的bracketSequenceNumber子元素值重复时,需要抛出异常。元素数量不固定,可多于3个。
正确实现代码
以下是可直接使用的XQuery代码,包含示例XML和重复检测逻辑:
let $input-xml := document { <root> <bracketQualifier> <bracketSequenceNumber>1</bracketSequenceNumber> </bracketQualifier> <bracketQualifier> <bracketSequenceNumber>1</bracketSequenceNumber> </bracketQualifier> <bracketQualifier> <bracketSequenceNumber>2</bracketSequenceNumber> </bracketQualifier> </root> } -- 收集所有序列编号值 let $sequence-values := $input-xml/bracketQualifier/bracketSequenceNumber/text() -- 筛选出重复出现的编号 let $duplicate-numbers := distinct-values($sequence-values)[count($sequence-values[. = current()]) > 1] return if (exists($duplicate-numbers)) then -- 抛出自定义异常,包含重复编号信息 error(xs:QName("DuplicateSequenceError"), concat("发现重复的序列编号:", string-join($duplicate-numbers, ", "))) else "所有序列编号均唯一"
代码说明
- 收集序列值:
$sequence-values提取所有bracketSequenceNumber的文本内容,便于后续统计。 - 检测重复:通过
distinct-values去重后,筛选出出现次数超过1次的编号,存入$duplicate-numbers。 - 异常抛出:如果存在重复值,调用
error()函数抛出带自定义错误名称和详细信息的异常;无重复则返回验证通过提示。
结合额外条件的扩展实现
如果需要结合$GDSN_PriceSyncPriceSegmentTM/value = '250'的条件触发检测,可修改代码如下:
let $input-xml := document { /* 替换为你的实际XML数据源 */ } let $trigger-condition := $input-xml/GDSN_PriceSyncPriceSegmentTM/value = '250' let $sequence-values := $input-xml/bracketQualifier/bracketSequenceNumber/text() let $duplicate-numbers := distinct-values($sequence-values)[count($sequence-values[. = current()]) > 1] return if ($trigger-condition and exists($duplicate-numbers)) then error(xs:QName("DuplicateSequenceError"), concat("当value为250时,发现重复序列编号:", string-join($duplicate-numbers, ", "))) else "验证通过"
原代码问题分析
你之前的代码未成功实现需求,主要问题有两点:
- 选择器错误:使用了属性选择器
@bracketSequenceNumber,但目标值是子元素而非属性,应改为子元素路径bracketSequenceNumber。 - 上下文与逻辑错误:循环中统计重复时未指定正确的上下文节点,且判断条件
$count >=1逻辑错误,应判断是否存在出现次数>1的编号。
内容的提问来源于stack exchange,提问作者DengerZone
相关产品推荐
相关产品推荐

