QWeb视图中如何用XPath选中if-else语句内的目标元素?
QWeb条件渲染下的XPath元素定位方案
你忽略的核心点是:QWeb的t-if/t-else-if是运行时条件渲染逻辑——页面加载后,只有满足条件的分支会被实际渲染到DOM中,两个<div>永远不会同时存在。所以你用//div[1]///div[2]这种基于位置的XPath,必然会在某一条件下找不到元素;而直接用//div时,若操作逻辑只处理第一个匹配项,或测试时未触发对应条件(比如没让somethingElse为真),DOM里不存在第二个div,自然无法选中。
针对这个场景,推荐以下几种定位方案:
基于文本内容定位:
直接通过div的文本内容匹配,不管哪个分支被渲染,只要文本符合就能选中://div[contains(text(), 'INFORMATION') or contains(text(), 'SOME OTHER INFROMATION')]若文本固定,也可使用精确匹配:
//div[text()='INFORMATION' or text()='SOME OTHER INFROMATION']基于模板上下文定位(适合模板继承场景):
如果你是在Odoo中修改QWeb模板(比如通过视图继承),可直接针对模板里的静态元素定位,无需考虑运行时渲染状态。比如分别修改两个分支的div:<!-- 修改第一个分支的div --> <xpath expr="//div[text()='INFORMATION']" position="replace"> <div>NEW INFORMATION</div> </xpath> <!-- 修改第二个分支的div --> <xpath expr="//div[text()='SOME OTHER INFROMATION']" position="replace"> <div>NEW OTHER INFORMATION</div> </xpath>这种方式在模板编译前处理,不管条件是否满足,都能找到模板中的原始元素进行修改。
基于父容器定位:
若两个条件分支有共同的父节点,可先定位父节点,再选中其下的div://*[starts-with(@t-if, 'something') or starts-with(@t-else-if, 'somethingElse')]/following-sibling::div[1]这种写法依赖模板结构稳定性,需确保父节点的
t-if/t-else-if属性匹配。
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

