XPath:选择self并跟随兄弟姐妹

时间:2013-05-16 09:43:43

标签: html xpath

<div>
    <dt>
        Test 1
    </dt>
    <dd>
    </dd>
    <dt>
        Test 2
    </dt>
    <dd>
    </dd>
</div>

到目前为止我已经编写了这个XPath

//dt[contains(text(), "Test")]/self::dt|following-sibling::dd

但这并没有带来 dt dd ,只是 dt

6 个答案:

答案 0 :(得分:4)

如果它必须是单个XPath 1.0表达式,那么你将不得不说

//dt[contains(., 'Test')] | //dt[contains(., 'Test')]/following-sibling::dd[1]

最终的[1]很重要,因为没有它会提取所有 dd元素,这些元素跟随包含“Test”的dt,即给定

<div>
    <dt>
        Test 1
    </dt>
    <dd>
        Foo
    </dd>
    <dt>
        Something else 2
    </dt>
    <dd>
        Bar
    </dd>
</div>

没有[1]的版本将匹配三个节点,dt包含“测试1”和两者“Foo”和“Bar”dd元素。 使用 [1],您只能正确获得“测试1”和“Foo”。

但是,根据您使用XPath的具体方式,首先选择

可能会更清楚
//dt[contains(., 'Test')]

然后迭代匹配的节点,并评估

. | following-sibling::dd[1]

依次在每个节点的上下文中。

答案 1 :(得分:2)

使用XPath 2.0时:

//dt[contains(text(), "Test")]/(self::dt, following-sibling::dd)

答案 2 :(得分:0)

试试这个XPATH:

//dt[contains(text(), "Test")]/self::dt or //dt[contains(text(), "Test")]/following-sibling::dd

答案 3 :(得分:0)

为避免重复contains元素的dt测试,您可以重写查询,以便所有需要的输出元素仅在搜索条件中表示一次:

//*[contains(self::dt|self::dd/preceding-sibling::dt[1],"Test")]

说明:从所有可能输出元素的池开始,选择dtdd前面的dt,其中dt与搜索匹配。

这个答案包括一个减少代码重复的方法,并且更容易阅读表达式的联合运算符| ......

答案 4 :(得分:0)

我尝试做类似的事情。
(在XPath group selected node with next sibling中,我尝试将它们分组。)

也许有人对我的小组问题有答案。

示例

带有该线程的XML

<div>
    <dt>
        Test 1
    </dt>
    <dd>
        Foo
    </dd>
    <dt>
        Something else 2
    </dt>
    <dd>
        Bar
    </dd>
</div>

预期结果

(作为数组结果集)

 1. <dt>Test 1</dt><dd>Foo</dd>
 2. <dt>Something else 2</dt><dd>Bar</dd>

答案 5 :(得分:-1)

根据你的例子,你可能能够使用这个xpath,它更短更简单,但是假设你正在寻找dt​​,然后你想要dt的所有兄弟姐妹(不仅仅是以下的兄弟姐妹和自)。此xpath查找dt的父级并抓取其所有子级:

//dt[contains(text(), "Test")]/../*