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

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

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

但这并没有同时带来dtdd,而只是带来dt

4

5 回答 5

5

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

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

final[1]很重要,因为没有它,它将提取包含“Test”的 dt 之后的所有dd 元素,即给定

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

没有 的版本[1]将匹配三个节点,即dt包含“Test 1”以及 Foo”和“Bar”dd元素。 有了它,[1]您将正确地得到“Test 1”和“Foo”。

但是根据您使用 XPath 的确切方式,首先选择可能更清楚

//dt[contains(., 'Test')]

然后遍历匹配的节点,并评估

. | following-sibling::dd[1]

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

于 2013-05-16T10:41:26.283 回答
3

使用 XPath 2.0 时:

//dt[contains(text(), "Test")]/(self::dt, following-sibling::dd)
于 2013-05-16T10:11:47.347 回答
0

试试这个 XPATH:

//dt[contains(text(), "Test")]/self::dt or //dt[contains(text(), "Test")]/following-sibling::dd
于 2013-05-16T09:51:51.060 回答
0

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

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

说明:从所有可能的输出元素的池开始,在这些元素中,选择 adt或 add前面的 a dt,其中任一dt匹配搜索。

包含此答案以显示一种减少代码重复并使其更易于阅读表达式的联合运算符的方法|...

于 2017-10-22T05:31:04.560 回答
-1

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

//dt[contains(text(), "Test")]/../*
于 2013-05-20T19:23:33.737 回答