2010-01-04 48 views
3

我有以下类型的HTML。内容按<div "id=foo"><div "id=foo1">元素分组,中间为<div "style=padding…">XPath只能直接跟随兄弟姐妹

我试图找出如何制定一个XPath表达式,让我来触发关闭"id=foo""style=padding…"

获取<div id="foo">是微不足道的回报兄弟<div>秒。但是,我不能只根据"style=padding…"执行following-sibling,因为它会返回所有匹配的<div>

我需要一种方法来返回匹配<div> s,直到我碰到与"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

您应该能够构造一个基于“之前的兄弟”轴的谓词,并将其应用于使用“跟随兄弟”轴检索的节点集。但是,我不想尝试调试/维护该查询。 – kdgregory 2010-01-04 16:24:40

+0

如果你在谈论xhtml,是否有多个元素具有相同的id? (ID = “foo” 的)。 – Cheeso 2010-01-05 19:15:53

回答

5

有没有理由不采取简单的方法来挑选所有没有id属性的div

div[not(@id)] 

或者,或许,div s有一个style属性?

div[@style] 

如果由于某种原因,这是不能接受的,你可以用的东西去更像是自己所想:

div[@style][following-sibling::div[@id='foo1']] 

它可以获取所有div S的样式属性div之前哪来s匹配一个特定的id。这是你要求的吗?

我想你的实际输入HTML不如你提供的例子微不足道,但是我列出的所有这些XPath表达式都适用于你的例子。如果您可以提供有关您的预期产出和您遇到的问题的更具体细节,那么我可以为您提供更多帮助。

-3

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

0

我不认为这种使用XPath查询是可行的。它会要求你记住所选div的索引(不那么难),但是然后比较它的兄弟姐妹的索引和它后面的第一个#foo1 div。如果可能的话,这是一个非常复杂的XPath查询。 XPath不容易让你保留多个作用域来比较元素或属性。

您最好先选择两个分隔符div,然后匹配两者之间的分隔符。这在代码中很容易,然后在XPath中执行。

如果你确实需要在XPath中做到这一点,你希望定界符div有不同的ID(首先,具有相同ID的多个元素无论如何都是无效的,所以使用不同的ID或类名),以及然后以某种方式匹配带有填充的div上的id或class名称。换句话说,更改HTML以提供足够的参考,而不是尝试在XPath中完全解决它。

-2

你最好的长期赌注是修复HTML。任何其他解决方案都很脆弱。

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">的下面兄弟(这是尽可能你有你自己的,选择所有的人都)。

然后它计算每个人的前兄弟<div id="foo">,并且只匹配那些在这里具有正确号码的人,例如,多一个<div id="foo">比各自<div id="foo">本身有。改变数字n以选择另一组。

如果您输入的内容,其实具有相同ID的多个元素,它就会简单很多:

//div[@style='padding…'][preceding-sibling::div[@id][1]/@id = 'foo'] 

这将选择那些<div style="padding…">其中第1跟前<div>(即有id )的ID值为'foo'。如上所述,这意味着只有一个<div>,其ID为'foo',并且其他前面的<div> s是而不是具有ID。