关于后代轴和'//'的混淆

时间:2013-05-09 17:22:46

标签: xml xpath

文件结构:

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

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

返回它:

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

这将在 projectionDay

中返回第一个和最后一个
//projection[position() = 1 or position() = last()]

为什么会这样?

1 个答案:

答案 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()]