|
楼主 |
发表于 2019-8-8 12:52
|
显示全部楼层
我和老师的想法有点不一样,
[] 谓词内的就是历遍当前节点集,所以self就是历遍到的当前节点,只有一个节点,不是集合,这里可以用 " . ",可以用count(self::b)=1 检测 。
[] 的就是当前节点集的每个节点都要求检测一遍的意思。
假设xml为 :
<a>
<b>1</b>
<b>2</b>
<b>3</b>
<b>4</b>
</a>
1. a/b = b元素的节点集合,{a/b[1],a/b[2],a/b[3],a/b[4]}为了理解理解就当是一个值的集合{1,2,3,4},
2. a/b[.>1] ={a/b[1][1>1],a/b[2][2>1],a/b[3][3>1],a/b[4][4>1]}
=》{a/b[2],a/b[3],a/b[4]}=>{2,3,4}
在[]里,这个集合每个值都历遍一次
-************************************---------
=FILTERXML("<a><b>"&SUBSTITUTE($B$301,",","</b><b>")&"</b></a>","a/b[self::b = not(.<../b)]")
老师的xpath a/b[self::b = not(.<../b)] ,我的解读为:
1. a/b ==》a根节点下的b节点集
2. self::b ==》b节点历遍时当前的节点
3. ../b ==》当前节点的的父节点下的b节点集合,这里就是a/b
4. .<../b ==》当前节点是否有比b节点集合小的值存在(因为比较大小,必须转为数值),只要有一个存在就返回true,否则返回false
5. not(.<../b) ==》非运算,如果第4点的结果为true,返回false,反之则相反。
6. self::b = not(.<../b) ==》结果推导
1). self::b = true() ==> true()=true() ==>true()。
2). self::b = false() ==> true()=false() ==>false()。
奇怪吧,为什么这样推导,
在等号 、 大于、小于、大于等于、小于等于时,尽量把两头的数据类型转换为一致
not(.<../b) 的结果肯定是逻辑值,所以会试着把 self::b 转为逻辑值
因为集合里面出来一个节点self::b,是真实存在的,所以self::b 始终返回true()
愚见:实际上就是self::b不是集合,只是当前的一个节点,在这个公式内加不加都没有任何关系。
请老师指点~。
|
评分
-
2
查看全部评分
-
|