如果子项存在,则XPath选择子项,否则选择parent

时间:2014-03-29 20:34:42

标签: xpath

我正在处理有时包含自己文本的元素,有时包含带有文本的span。我正在我的程序中生成一个xpath,根据title属性获取我需要的元素,所以我使用的是这样的模板:

//div[@class='grid-canvas']//*[@title='Row %d column %s']

这适用于具有自己文本的元素。但如果他们将文本保留在子跨度内,那么我必须更改我的xpath模板:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/span

我真的只想为我的xpath使用一个模板。因为如果它没有子节点我想要父节点,或者如果它存在则需要子元素(它是一个span),我认为像.[not(node())] | span这样的东西应该有效,所以我尝试了这个:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/.[not(node())] | span

但它没有用。我无法弄清楚我错过了什么。我做错了什么?

1 个答案:

答案 0 :(得分:1)

你的第三个查询再次开始在当前上下文中搜索 - 如果你没有在其他地方设置它,它将扫描<span/>根元素。

XPath 1.0 不允许“在中间”或路径末尾的替换,仅作为前缀,因此您必须重复整个路径:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/span |
//div[@class='grid-canvas']//*[@title='Row %d column %s'][not(span)]

这将选择所有“子”跨度和那些不包含span元素的父元素。

XPath 2.0 中,如果只存在一个(或没有)span元素,则可以执行此操作:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/(span, .)[1]

或任意数字:

//div[@class='grid-canvas']//*[@title='Row %d column %s']/(span, .[not(span)])