如何用XPath选中除含两个selected属性的第二个select外的所有节点
正确XPath表达式:选中所有select节点并排除含两个selected属性option的节点
目标HTML代码
<table> <select> <option value="one">1</option> <option value="two">2</option> <option value="three">3</option> <option value="four">4</option> <option selected="selected" value></option> <select> <select> <option value="one">1</option> <option value="two">2</option> <option selected="selected" value="three">3</option> <option value="four">4</option> <option selected="selected" value></option> <select> <select> <option value="one">1</option> <option value="two">2</option> <option value="three">3</option> <option value="four">4</option> <option selected="selected" value></option> <select> <select> <option value="one">1</option> <option value="two">2</option> <option value="three">3</option> <option value="four">4</option> <option selected="selected" value></option> <select> </table>
需求说明
选中所有<select>节点,但排除第二个select(该节点包含两个带有selected="selected"属性的<option>元素)
错误表达式分析
你之前尝试的*//table//[select[not(@value='') and not(option[@selected='selected'])]]存在两个核心问题:
- 语法错误:
//后直接跟谓词[ ]不符合XPath语法,正确写法应该是先定位到select节点再添加筛选条件; - 逻辑错误:
not(option[@selected='selected'])会排除所有包含选中option的select,但第一个select也有一个选中的option,同时你误将value属性归给了select(实际是option的属性),导致表达式完全没起到筛选作用。
正确XPath表达式
方案1:基于选中option的数量(推荐,结构变化时仍有效)
//table/select[count(option[@selected='selected']) != 2]
这个表达式会筛选出<table>下所有包含非2个带有selected="selected"属性的<option>的<select>节点,精准排除第二个select(它正好有2个选中的option)。
方案2:基于节点位置(仅当结构固定时适用)
如果确定第二个select的位置不会变化,也可以直接通过位置排除:
//table/select[position() != 2]
内容的提问来源于stack exchange,提问作者Mysterious Jack
相关产品推荐
相关产品推荐

