有没有办法在 xpath select 或 select 元素中使用两个 @* ?
Is there a way to use two @* in an xpath selector to select an element?
我有一个 HTML 元素,我想 select 看起来像这样:
<button data-button-id="close" class="modal__cross modal__cross-web"></button>
现在很明显我可以使用这个 XPath select或者:
//button[(contains(@data-button-id,'close')) and (contains(@class,'modal'))]
到select元素。但是,我真的很想 select 按钮同时具有 close
和 modal
包含在 any 属性中。所以我可以概括 selector 并说:
//button[(contains(@*,'close')) and (contains(@class,'modal'))]
这行得通。我想做的是将其扩展到:
//button[(contains(@*,'close')) and (contains(@*,'modal'))]
但这 return 没有任何结果。很明显,这并不意味着我想要它的意思。有没有正确的方法?
谢谢,
克雷格
这个表达式有效:
//button[attribute::*[contains(.,"close")] and attribute::*[contains(.,"modal")]]
鉴于此 html
<button data-button-id="close" class="modal__cross modal__cross-web"></button>
<button key="close" last="xyz_modal"></button>
使用 xmllint 进行测试
echo -e 'cat //button[attribute::*[contains(.,"close")] and attribute::*[contains(.,"modal")]]\nbye' | xmllint --html --shell test.html
/ > cat //button[attribute::*[contains(.,"close")] and attribute::*[contains(.,"modal")]]
-------
<button data-button-id="close" class="modal__cross modal__cross-web"></button>
-------
<button key="close" last="xyz_modal"></button>
/ > bye
试试这个 select 所需元素:
//button[@*[contains(., 'close')] and @*[contains(., 'modal')]]
看起来您使用的是 XPath 1.0:在 1.0 中,如果您提供 node-set 作为 contains() 的第一个参数,它将采用 node-set 中的第一个节点。属性的顺序是完全不可预知的,因此无法知道 contains(@*, 'close')
是否会成功。在 2.0+ 中,这会给你一个错误。
在 1.0 和 2.0 中,@*[contains(., 'close')]
returns 如果任何属性包含“close”作为子字符串,则为真。
我有一个 HTML 元素,我想 select 看起来像这样:
<button data-button-id="close" class="modal__cross modal__cross-web"></button>
现在很明显我可以使用这个 XPath select或者:
//button[(contains(@data-button-id,'close')) and (contains(@class,'modal'))]
到select元素。但是,我真的很想 select 按钮同时具有 close
和 modal
包含在 any 属性中。所以我可以概括 selector 并说:
//button[(contains(@*,'close')) and (contains(@class,'modal'))]
这行得通。我想做的是将其扩展到:
//button[(contains(@*,'close')) and (contains(@*,'modal'))]
但这 return 没有任何结果。很明显,这并不意味着我想要它的意思。有没有正确的方法?
谢谢, 克雷格
这个表达式有效:
//button[attribute::*[contains(.,"close")] and attribute::*[contains(.,"modal")]]
鉴于此 html
<button data-button-id="close" class="modal__cross modal__cross-web"></button>
<button key="close" last="xyz_modal"></button>
使用 xmllint 进行测试
echo -e 'cat //button[attribute::*[contains(.,"close")] and attribute::*[contains(.,"modal")]]\nbye' | xmllint --html --shell test.html
/ > cat //button[attribute::*[contains(.,"close")] and attribute::*[contains(.,"modal")]]
-------
<button data-button-id="close" class="modal__cross modal__cross-web"></button>
-------
<button key="close" last="xyz_modal"></button>
/ > bye
试试这个 select 所需元素:
//button[@*[contains(., 'close')] and @*[contains(., 'modal')]]
看起来您使用的是 XPath 1.0:在 1.0 中,如果您提供 node-set 作为 contains() 的第一个参数,它将采用 node-set 中的第一个节点。属性的顺序是完全不可预知的,因此无法知道 contains(@*, 'close')
是否会成功。在 2.0+ 中,这会给你一个错误。
在 1.0 和 2.0 中,@*[contains(., 'close')]
returns 如果任何属性包含“close”作为子字符串,则为真。