我使用this link从教程中尝试了一些XPath:
所以我尝试了XPath的这两个变体.
>这个表达
//webengagedata//preceding-sibling::*
返回14结果
>这个表达
//webengagedata/preceding-sibling::*
返回9结果
“//”与另外5个结果相匹配的是什么?
/ vs //一般子(/)和后代 – 或 – 自(//)都是axes in XPath.
> /是/ child :: node()/的缩写.
使用/选择节点的直接子节点.
> //是/ descendant-or-self :: node()/的缩写.
使用//来选择
节点,它的子节点,它的孙子节点等等
递归.
/ vs // with preceding-sibling :: *
您的具体问题询问了// previous-sibling :: *和/ preceding-sibling :: *之间的区别.
由于您的数据非现场且复杂,我们应考虑使用现有且更简单的XML:
<r> <a/> <b> <c/> <d/> </b> </r>
对于这个XML,
> / r / preceding-sibling :: *什么都不选,因为r没有兄弟姐妹.> / r // preceding-sibling :: *选择前面的兄弟元素r的所有后代或自身节点.即,a,b,c和d.(请记住,/ r // preceding-sibling :: *是/ descendant-or-self :: node()/ preceding-sibling :: *的缩写,而不是/ descendant-or-self :: * / preceding-sibling: :*)请注意,即使b和d是没有元素的前任兄弟,它们也是文本节点的前任兄弟,因为上面的XML在b和d之后有空格.如果删除了空格,则只选择b和d.> / r / descendant :: * / preceding-sibling :: *选择r的所有后代元素的前一个兄弟元素.即a和c.请注意,未选择b和d,因为它们不是r的任何后代元素的兄弟元素之前 – 与前面的示例不同,文本节点不符合条件.