关于xpath中的"()"写法,有些不解,请大佬们帮忙解答哈 ...
问题1:xpath语句中,//b/@甲组出现不了唯一的结果,而(//b/@甲组)可以。问题2:"()"加在谓语之前的括号,是起到了什么作用。
问题3:(//b/@甲组)与//b/@甲组,又均可出相同的结果,那么这个"()"的特定条件是什么呢?
以上三个问题,请教大佬们务必解答下哈。
以下是个人做的对比附件,请大佬们参考。
受难受大佬都不解的,我就悄悄看一眼,这函数只敢模仿。也就收藏了海版的原帖照着用。都不敢研究 大佬这么过谦吗?说不定大佬不经意间的一语,就解开了我的疑惑呢,还请大佬不吝赐教。 海版的原创文章,海版出海捞大福将去了,晚点他会回复你的。 已私信~~谢谢安于平淡大佬提醒~~~ 个人理解
不加括号,是求每一条甲组的最后一个
加了括号,就改变了运算顺序,先求所有甲组,再求最后一个 你好,大佬。那么最后一问里面,谓语之前加括号,和不加括号,都可以出来结果,是否还跟谓语有关呢? 说到底还是上下文的关系~!
一.例题:
last() 属于聚合运算 他是针对上下文的集合再运算的。
1. xpath: //a/c
//a/c 就是红色部位, 针对的的上下文为:只有唯一的元素父节点a 。
所以是兄弟关系的集合中取最后一个,结果为 大福将2
2. xpath: (//a/c)
的上下文是 (//a/c)的集合。 ()是优先运算符,把//a/c作为一个集合然后再在里面找最后一个
结果为:大福将2
3.xpath: //c 针对的是每个 //c的同个父节点的儿子的集合,这里可以分成 橙色 和红色两部分
父节点 b和 a,兄弟集合 分别为 【丐帮财经大福将】;【大福将1、大福将2】,分别取最后的节点,结果为: 【丐帮财经大福将】 和 【大福将2】
总的来说,就是分别对每个岔路口重复上下文关系运算。用括号就是把所有的岔路口都归为一个,然后再上下文运算。
二. 对于 最后的例子也是同样的
//b/@甲组 、(//b/@甲组)
1. //b/@甲组: 这里是【每个b节点下甲组属性值集合(上下文独立的)】组成的
每个b下面有一个集合,即使是一个值。一个集合就是一个上下文。
2. (//b/@甲组) :所有b节点下甲组属性值的集合(是一个整体集合)
后面的谓词运算 【not(.=preceding::b/@甲组)】 都是每个单独历遍并运算 所以 //b/@甲组 和 (//b/@甲组)没有区别。
如果用 //b/@甲组 和 (//b/@甲组) 就能看出来 上下文的集合是不一样的。
三. 再来看你的例子
你的疑问: (//b/@甲组)可出结果,而//b/@甲组只返回123,123
参考 二 中的1和2
//b/@甲组 可以看做 数组内分别放着 每个b下的属性为甲组的这样一个集合
{{第一个b属性为甲组的集合},{第二个b属性为的集合},.....}
运算过程:
按顺序取 {第一个b属性为甲组的集合}
=》按照谓词顺序运算并 返回结果,如果谓词为 那么返回{第一个b属性为甲组的集合}中的第一个,没有符合的则不返回结果(真空)。
按顺序取 {第二个b属性为甲组的集合}
=》按照谓词顺序运算并 返回结果,如果谓词为 那么返回{第二个b属性为甲组的集合}中的第二个,没有符合的则不返回结果(真空)。
.......
直至结束,最后返回所有结果的集合。
再看下面:
xpath: //b/@甲组
=>{"//b/@甲组";"//b/@甲组";"//b/@甲组";"//b/@甲组";.....}这里是数组
每个都会单独运算,所以分别看每个xpath
"//b/@甲组" 按照【//b/@甲组】上下文的关系,实际结果为一个3个结果的数组。
"//b/@甲组" 按照【//b/@甲组】上下文的关系,都没有第二个袁术。实际结果为真空(返回错误值)。
......所以你说的错误就是这样来的....
同样:
xpath: (//b/@甲组)
(//b/@甲组) 是所有【//b/@甲组】的集合
(//b/@甲组)按照上下文的关系,实际结果为(//b/@甲组)第一个值。
(//b/@甲组)按照上下文的关系,实际结果为(//b/@甲组)第二个值。
.......
所以就满足了你说的都会返回结果的情况。
好像说的好啰嗦哈。
总之重要的话:
上下文
上下文
上下文 个人理解
preceding代表前面所有的,加不加括号返回的内容是一样的。
具体我也说不清楚,但我是这么理解的,呵呵。 谢谢大佬的解释,我个人理解为:()是强制优先级运算的意思。至于加不加括号都出一样的结果,应该是遍历的问题。大影影说的更加形象,是同胞兄弟与结拜兄弟,关于是否一个爹的问题。
页:
[1]