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

jir*_*ira 1 xml xpath

文件结构:

<program>
 <projectionDay>
   <projection/>
   <projection/>
 </projectionDay>
 <projectionDay>
   <projection/>
   <projection/>
 </projectionDay>
</program>
Run Code Online (Sandbox Code Playgroud)

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

这会返回它:

/descendant::projection[position() = 1 or position() = last()]
Run Code Online (Sandbox Code Playgroud)

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

//projection[position() = 1 or position() = last()]
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Jen*_*rat 5

您的第一个查询使用descendant获取所有<projection/>元素,然后为第一个和最后一个元素筛选此结果集:

/descendant::projection[position() = 1 or position() = last()]
Run Code Online (Sandbox Code Playgroud)

//是.的缩写/descendant-or-self::*/.所以你的第二个查询实际意味着

/descendant-or-self::*/projection[position() = 1 or position() = last()]
Run Code Online (Sandbox Code Playgroud)

它看起来到所有元素(在这里:每个<projectionDay/>,并返回第一个和最后一个<projection/>元素这个元素里面.


要在所有<projeectionDay/>s 上返回第一个和最后一个元素,请将谓词前的所有内容放入括号中:

(/descendant-or-self::*/projection)[position() = 1 or position() = last()]
Run Code Online (Sandbox Code Playgroud)

或缩写:

(//projection)[position() = 1 or position() = last()]
Run Code Online (Sandbox Code Playgroud)