我正在处理有时包含自己文本的元素,有时包含带有文本的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
但它没有用。我无法弄清楚我错过了什么。我做错了什么?
答案 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)])