如何在XPath 2.0中判断序列是否为另一序列的有序或连续子序列?
在XPath 2.0中判断序列的有序子序列与连续子序列
1. 判断有序子序列(元素按顺序出现,无需连续)
有序子序列的核心要求是:目标序列的所有元素必须按相同顺序出现在母序列中,但元素之间可以夹杂其他元素。比如('1','3')是('a','1','b','3')的有序子序列。
你可以用以下XPath表达式实现判断(假设$main-seq是母序列,$sub-seq是待判断的目标序列):
every $i in 1 to count($sub-seq) satisfies index-of($main-seq, $sub-seq[$i])[1] > (if ($i eq 1) then 0 else index-of($main-seq, $sub-seq[$i-1])[1])
逻辑说明:
- 遍历目标序列的每个元素,依次检查它在母序列中的第一个出现位置
- 确保每个后续元素的位置都严格大于前一个元素的位置
- 如果目标序列是空序列,表达式会默认返回
true(空序列是任何序列的子序列)
2. 判断连续子序列(元素按顺序且连续出现)
连续子序列要求目标序列是母序列中连续的一段,元素顺序完全匹配。比如你举例的('1','2')就是('a','b','1','2','3','4')的连续子序列。
对应的XPath表达式如下:
some $start in 1 to (count($main-seq) - count($sub-seq) + 1) satisfies subsequence($main-seq, $start, count($sub-seq)) = $sub-seq
逻辑说明:
- 遍历母序列中所有可能的起始位置(起始位置范围是
1到母序列长度 - 子序列长度 + 1,避免越界) - 检查从该起始位置开始、长度与目标序列一致的子序列,是否和目标序列完全相等
- 只要存在一个符合条件的起始位置,就返回
true;空序列同样默认返回true
示例验证:
针对你给出的例子:
- 母序列
$main-seq = ('a','b','1','2','3','4'),目标序列$sub-seq = ('1','2') - 当
$start=3时,subsequence($main-seq, 3, 2)返回('1','2'),与目标序列完全匹配,因此表达式返回true
内容的提问来源于stack exchange,提问作者yas
相关产品推荐
相关产品推荐

