有没有办法在 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 按钮同时具有 closemodal 包含在 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”作为子字符串,则为真。