文件结构:
<program>
<projectionDay>
<projection/>
<projection/>
</projectionDay>
<projectionDay>
<projection/>
<projection/>
</projectionDay>
</program>
我想选择第一个和最后一个投影(在整个文档中)。
返回它:
/descendant::projection[position() = 1 or position() = last()]
这将在 projectionDay
中返回第一个和最后一个//projection[position() = 1 or position() = last()]
为什么会这样?
答案 0 :(得分:5)
使用descendant
的第一个查询会获取所有<projection/>
元素,然后对第一个和最后一个元素过滤此结果集:
/descendant::projection[position() = 1 or position() = last()]
//
是/descendant-or-self::*/
的缩写。所以你的第二个查询实际上意味着
/descendant-or-self::*/projection[position() = 1 or position() = last()]
查看所有元素(此处:每个<projectionDay/>
,并返回此元素中的第一个和最后一个<projection/>
元素。
要返回所有<projeectionDay/>
的第一个和最后一个元素,请将谓词前的所有内容放入括号中:
(/descendant-or-self::*/projection)[position() = 1 or position() = last()]
或缩写:
(//projection)[position() = 1 or position() = last()]