文件结构:

<program>
 <projectionDay>
   <projection/>
   <projection/>
 </projectionDay>
 <projectionDay>
   <projection/>
   <projection/>
 </projectionDay>
</program>


我想选择第一个和最后一个投影(在整个文档中)。

返回它:

/descendant::projection[position() = 1 or position() = last()]


这将在projectionDay中返回第一个和最后一个

//projection[position() = 1 or position() = last()]


为什么呢?

最佳答案

使用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()]

10-05 20:16