找回密码
 立即注册
搜索

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

9
回复
1299
查看
[复制链接]

1

主题

5

帖子

2

幻币

初入江湖

Rank: 1

积分
9
2021-12-6 11:04:00 显示全部楼层 |阅读模式
问题1:xpath语句中,//b/@甲组[last()]出现不了唯一的结果,而(//b/@甲组)[last()]可以。
问题2:"()"加在谓语之前的括号,是起到了什么作用。
问题3:(//b/@甲组)与//b/@甲组,又均可出相同的结果,那么这个"()"的特定条件是什么呢?
以上三个问题,请教大佬们务必解答下哈。
以下是个人做的对比附件,请大佬们参考。
xpath.rar (13.8 KB, 下载次数: 11)
PPT学习论坛
回复

使用道具 举报

1

主题

10

帖子

0

幻币

初入江湖

Rank: 1

积分
10
2021-12-21 09:57:57 显示全部楼层
受难受大佬都不解的,我就悄悄看一眼,这函数只敢模仿。也就收藏了海版的原帖照着用。都不敢研究
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

幻币

初入江湖

Rank: 1

积分
0
2022-1-5 17:18:34 显示全部楼层
大佬这么过谦吗?说不定大佬不经意间的一语,就解开了我的疑惑呢,还请大佬不吝赐教。
PPT学习论坛
回复 支持 反对

使用道具 举报

1

主题

8

帖子

2

幻币

初入江湖

Rank: 1

积分
12
2022-1-25 22:14:28 显示全部楼层
海版的原创文章,海版出海捞大福将去了,晚点他会回复你的。
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

9

帖子

-2

幻币

初入江湖

Rank: 1

积分
5
2022-2-1 13:53:06 显示全部楼层
已私信~~谢谢安于平淡大佬提醒~~~
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

幻币

初入江湖

Rank: 1

积分
0
2022-2-3 15:29:14 显示全部楼层
个人理解
不加括号,是求每一条甲组的最后一个
加了括号,就改变了运算顺序,先求所有甲组,再求最后一个
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

幻币

初入江湖

Rank: 1

积分
5
2022-2-17 19:05:59 显示全部楼层
你好,大佬。那么最后一问里面,谓语之前加括号,和不加括号,都可以出来结果,是否还跟谓语有关呢?
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

5

帖子

-1

幻币

初入江湖

Rank: 1

积分
3
2022-2-26 17:21:05 显示全部楼层
说到底还是上下文的关系~!
一.例题:
10950f807cffcdc5fcf8acce6ddd5348.png
last() 属于聚合运算 他是针对上下文的集合再运算的。
1. xpath: //a/c[last()]
//a/c 就是红色部位,[last()] 针对的的上下文为:只有唯一的元素父节点a 。
所以是兄弟关系的集合中取最后一个,结果为 大福将2
2. xpath: (//a/c)[last()]
[last()] 的上下文是 (//a/c)的集合。 ()是优先运算符,把//a/c作为一个集合然后再在里面找最后一个
结果为:大福将2
3.xpath: //c[last()]  [last()] 针对的是每个 //c的同个父节点的儿子的集合,这里可以分成 橙色 和红色两部分
父节点 b和 a,兄弟集合 分别为 【丐帮财经大福将】;【大福将1、大福将2】,分别取最后的节点,结果为: 【丐帮财经大福将】 和 【大福将2】
总的来说,就是分别对每个岔路口重复上下文关系运算。用括号就是把所有的岔路口都归为一个,然后再上下文运算。
二. 对于 最后的例子也是同样的
//b/@甲组[not(.=preceding::b/@甲组)] 、(
//b/@甲组)[not(.=preceding::b/@甲组)]
1. //b/@甲组: 这里是每个b节点下甲组属性值集合(上下文独立的)】组成的
每个b下面有一个集合,即使是一个值。一个集合就是一个上下文。

2. (//b/@甲组) :所有b节点下甲组属性值的集合(是一个整体集合)
   
后面的谓词运算 【not(.=preceding::b/@甲组)】 都是每个单独历遍并运算 所以 //b/@甲组 和 (//b/@甲组)没有区别。
如果用 //b/@甲组[last()] 和 (//b/@甲组)[last()] 就能看出来 上下文的集合是不一样的。

三. 再来看你的例子

4e3d2076170610a008478ddb9a69df15.png
你的疑问: (//b/@甲组)可出结果,而//b/@甲组只返回123,123
参考 二 中的1和2
//b/@甲组 可以看做 数组内分别放着 每个b下的属性为甲组的这样一个集合
{{第一个b属性为甲组的集合},{第二个b属性为的集合},.....}
运算过程:
按顺序取 {第一个b属性为甲组的集合}
=》按照谓词顺序运算并
返回结果,如果谓词为 [1] 那么返回{第一个b属性为甲组的集合}中的第一个,没有符合的则不返回结果(真空)。
按顺序取 {第二个b属性为甲组的集合}
=》按照谓词顺序运算并 返回结果,如果谓词为 [2] 那么返回{第二个b属性为甲组的集合}中的第二个,没有符合的则不返回结果(真空)
.......
直至结束,最后返回所有结果的集合。
再看下面:
xpath: //b/@甲组[floor("&ROW(1:6)&" div 2+0.5)]
=>{"//b/@甲组[1]";"//b/@甲组[1]";"//b/@甲组[2]";"//b/@甲组[2]";.....}这里是数组
每个都会单独运算,所以分别看每个xpath
"//b/@甲组[1]" 按照【//b/@甲组】上下文的关系,实际结果为一个3个结果的数组。
"//b/@甲组[2]" 按照//b/@甲组】上下文的关系,都没有第二个袁术。实际结果为真空(返回错误值)。
......所以你说的错误就是这样来的....
同样:
xpath: (//b/@甲组)[floor("&ROW(1:6)&" div 2+0.5)]
(//b/@甲组) 是所有//b/@甲组】的集合
(
//b/@甲组)[1]按照上下文的关系,实际结果为(//b/@甲组)第一个值。
(//b/@甲组)[2]按照上下文的关系,实际结果为(//b/@甲组)第二个值。
.......
所以就满足了你说的都会返回结果的情况。
好像说的好啰嗦哈。
总之重要的话:
上下文
上下文
上下文
PPT学习论坛
回复 支持 反对

使用道具 举报

3

主题

8

帖子

5

幻币

初入江湖

Rank: 1

积分
18
2022-3-3 16:17:16 显示全部楼层
个人理解
preceding代表前面所有的,加不加括号返回的内容是一样的。
具体我也说不清楚,但我是这么理解的,呵呵。
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

4

帖子

-1

幻币

初入江湖

Rank: 1

积分
2
2022-3-5 06:53:59 显示全部楼层
谢谢大佬的解释,我个人理解为:()是强制优先级运算的意思。至于加不加括号都出一样的结果,应该是遍历的问题。大影影说的更加形象,是同胞兄弟与结拜兄弟,关于是否一个爹的问题。
PPT学习论坛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册