那天七月九号 发表于 2021-12-6 11:04:00

关于xpath中的"()"写法,有些不解,请大佬们帮忙解答哈 ...

问题1:xpath语句中,//b/@甲组出现不了唯一的结果,而(//b/@甲组)可以。
问题2:"()"加在谓语之前的括号,是起到了什么作用。
问题3:(//b/@甲组)与//b/@甲组,又均可出相同的结果,那么这个"()"的特定条件是什么呢?
以上三个问题,请教大佬们务必解答下哈。
以下是个人做的对比附件,请大佬们参考。

工众吧 发表于 2021-12-21 09:57:57

受难受大佬都不解的,我就悄悄看一眼,这函数只敢模仿。也就收藏了海版的原帖照着用。都不敢研究

颠倒 发表于 2022-1-5 17:18:34

大佬这么过谦吗?说不定大佬不经意间的一语,就解开了我的疑惑呢,还请大佬不吝赐教。

恋上咪 发表于 2022-1-25 22:14:28

海版的原创文章,海版出海捞大福将去了,晚点他会回复你的。

寻佛 发表于 2022-2-1 13:53:06

已私信~~谢谢安于平淡大佬提醒~~~

顺通达 发表于 2022-2-3 15:29:14

个人理解
不加括号,是求每一条甲组的最后一个
加了括号,就改变了运算顺序,先求所有甲组,再求最后一个

东方建 发表于 2022-2-17 19:05:59

你好,大佬。那么最后一问里面,谓语之前加括号,和不加括号,都可以出来结果,是否还跟谓语有关呢?

三言林雨 发表于 2022-2-26 17:21:05

说到底还是上下文的关系~!
一.例题:

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/@甲组)第二个值。
.......
所以就满足了你说的都会返回结果的情况。
好像说的好啰嗦哈。
总之重要的话:
上下文
上下文
上下文

潘进杰 发表于 2022-3-3 16:17:16

个人理解
preceding代表前面所有的,加不加括号返回的内容是一样的。
具体我也说不清楚,但我是这么理解的,呵呵。

吃葡萄吐柚子皮 发表于 2022-3-5 06:53:59

谢谢大佬的解释,我个人理解为:()是强制优先级运算的意思。至于加不加括号都出一样的结果,应该是遍历的问题。大影影说的更加形象,是同胞兄弟与结拜兄弟,关于是否一个爹的问题。
页: [1]
查看完整版本: 关于xpath中的"()"写法,有些不解,请大佬们帮忙解答哈 ...