|
楼主 |
发表于 2022-7-12 13:31
|
显示全部楼层
本帖最后由 象山海鲜 于 2022-7-12 15:20 编辑
针对你的提问回复
问题一:
a/b[/a/b>.]
1.你已经理解的上下文在谓词内历遍,谓词内的 /a/b 是集合(可以看做数组),. 看做数外面的 a/b 集合中的历遍到的一个元素(节点)
2.运算逻辑:谓词内的单值和集合的比较是集合每个元素和单值比较后的逻辑集合 然后再 or 处理为一个结果。
你的问题历遍到1的时候,在 /a/b 集合中比较有比1大的值(7.009,51,3,9)所以用 or聚合 /a/b>.的结果为 true。所以数字1是符合条件的 属于需要返回的结果之一。
问题二:
理解了问题一的第2点的运算逻辑,就会知道两者的结果差异了
a/b[/a/b>.] 去除最大值剩下的数值集合
a/b[/a/b<.] 去除最小值剩下的数值集合
问题三:
a/b[not(/a/b>.)=.*0+1]
1. /a/b>. 最大值和文本 返回 false
文本用数值比较符(>、>=、 <、 <=)结果直接就是 false
2. not(/a/b>.) 结果取反 最大值和文本 返回 true
3. .*0+1 结果就是 1 或 错误值(可看做false 或 0 )
4. not(/a/b>.)=.*0+1
true =1 或 false =1
逻辑值和数值比较规则为:逻辑值转为数值(尽量转为同类型比较)
true =1 false =0
not(/a/b>.) 中只有 最大值和文本 true 其余都为false
当. 为文本时 not(/a/b>.)=.*0+1 =>true = false =>false
当. 为最大值时 not(/a/b>.)=.*0+1 =>true= 1 =>1=1 =>true
当. 为不是最大值时 not(/a/b>.)=.*0+1 =>false= 1 =>0=1 =>false
.*0+1 是为了排除文本特意加的。全数值 用 a/b[not(/a/b>.)] 即可。
5. a/b[not(/a/b>.)=.*0+1] 最后结果为返回最大值的集合(多个会一起返回)
问题四: 图片公式 a/b[.*0+1]
1. 谓词[] 内为数值结果的只能是返回历遍当前的索引才能返回当前的节点。[]中的数值=索引,返回当前节点。
2. .*0+1 除了文本的错误值(false)其他都为数值1
当前恰巧索引1是文本,结果刚好是错误值(false),其余的索引和数值不对应,所有没有符合结果,返回空集合。
也就是说 a/b[.*0+2]返回 1
a/b[.*0+3] 返回 7.009
........
a/b[.*3-1] 第2个 1*3-1=2 第8个 3*3-1=8 刚好索引对应 返回{1;3}
其他:a/b[.] 谓词内的.没有运算,那么就是当前节点,谓词内不是按照节点的值和索引对应关系来算的,而是节点是否存在定的,所以这里谓词内返回的都是true,最后返回a/b的集合,a/b[.] 等价 a/b。
|
评分
-
1
查看全部评分
-
|