我有以下类型的HTML。内容按<div "id=foo">
和<div "id=foo1">
元素分组,中间为<div "style=padding…">
。
我正在试图弄清楚如何制作一个XPath表达式,允许我触发"id=foo"
以<div>
"style=padding…"
获取<div id="foo">
是微不足道的。但是,我不能仅基于following-sibling
执行"style=padding…"
,因为它会返回所有匹配的<div>
。
我需要一种方法来返回匹配的<div>
,直到我遇到与"id=foo1"
匹配的兄弟。我很确定我会错过一个简单的方法!
<div id="foo">stuff...</div>
<div style="padding:2px; ">stuff...</div>
<div id="foo1">stuff...</div>
<div id="foo">stuff...</div>
<div style="padding:2px; ">stuff...</div>
<div style="padding:2px; ">stuff...</div>
<div style="padding:2px; ">stuff...</div>
<div id="foo1">stuff...</div>
答案 0 :(得分:5)
是否有某种原因你不能采用简单的方法来挑选所有没有id属性的div
?
div[not(@id)]
或者,也许div
带有样式属性?
div[@style]
如果由于某种原因,这是不可接受的,你可以选择更像你的想法:
div[@style][following-sibling::div[@id='foo1']]
获取具有样式属性的所有div
,其中div
匹配特定ID。那是你要的吗?
我想你的实际输入HTML并不比你提供的示例简单,但我列出的所有这些XPath表达式都适用于你的例子。如果您可以提供有关您的预期输出以及您遇到的问题的更具体细节,那么我可以为您提供更多帮助。
答案 1 :(得分:1)
一个不太好看的方式做你想要的事情如下(注意它是基于你真的有多个<div>
s的假设id
):
/*/div[@id='foo'][n]/following-sibling::div[@style='padding…']
[
count(preceding-sibling::div[@id='foo'])
=
count(/*/div[@id='foo'][n]/preceding-sibling::div[@id='foo']) + 1
]
XPath表达式的第一行接受任何<div style="padding…">
,它是n'<div id="foo">
的后续兄弟(这是你自己的选择,选择 all < / em>他们)。
然后它为每个人计算前一个兄弟<div id="foo">
,并且仅匹配那些具有正确数字的人,例如比<div id="foo">
本身各自<div id="foo">
多一个//div[@style='padding…'][preceding-sibling::div[@id][1]/@id = 'foo']
。改变数字n以选择另一组。
如果你的输入实际上不有多个具有相同id的元素,那么它会变得更简单:
<div style="padding…">
这将选择<div>
之前的'foo'
(具有ID),其id值为<div>
。如上所示,这意味着只有一个'foo'
的ID为<div>
,并且{{1}}之前的其他 >有个身份。
答案 2 :(得分:0)
我不认为使用XPath查询是可行的。它需要你记住所选div的索引(不是很难),但是然后将它的兄弟的索引与那个兄弟的索引以及它后面的第一个#foo1 div进行比较。如果可能的话,这是一个非常复杂的XPath查询。 XPath不容易让您保留多个范围来比较元素或属性。
首先选择两个分隔符div,然后匹配两者之间的分隔符最好。这在代码中更容易,然后在XPath中。
如果你确实需要在XPath中执行它,你希望分隔符div具有不同的id(首先,具有相同id的多个元素无论如何都是无效的,所以使用不同的或类名),然后以某种方式匹配带有填充的div上的id或类名。换句话说,更改HTML以提供足够的引用,而不是尝试在XPath中完全解决它。
答案 3 :(得分:-2)
您最好的长期赌注是修复HTML。任何其他解决方案都是脆弱的。
答案 4 :(得分:-3)
给他们一个类名,而不是使用内联样式