XPath只能直接跟随兄弟姐妹

时间:2010-01-04 16:09:33

标签: xpath

我有以下类型的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>

5 个答案:

答案 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)

给他们一个类名,而不是使用内联样式

相关问题